linux中獲取堆棧空間大小的方法


 

#include   <stdio.h> 
#include   <stdlib.h> 
#include   <sys/time.h> 
#include   <sys/resource.h> 
#include   <unistd.h> 
  
int   main() 
{ 
        struct   rlimit   lmt; 
        getrlimit(RLIMIT_STACK,&lmt); 
        printf( "rlim_cur=%u,rlim_max=%u\n ",lmt.rlim_cur,lmt.rlim_max); 
} 
//編譯
 [root@fp-web-112 src]# gcc -g getstack.c -o getstack -lpthread
執行
[root@fp-web-112 src]# ./getstack
 rlim_cur=8388608,rlim_max=4294967295

 當前的堆棧空間為8M,但作為擴展,最大可支持4G(理論值)

8388608/1024/=8192/1024=8m

 

Resouce limit的大小可以直接影響進程的執行狀況。其有兩個最重要的概念:soft limit 和 hard limit。

struct rlimit { 
   rlim_t rlim_cur;
   rlim_t rlim_max;
};

soft limit

是指內核所能支持的資源上限。比如對於RLIMIT_NOFILE(一個進程能打開的最大文件 數,內核默認是1024),soft limit最大也只能達到1024。
對於RLIMIT_CORE(core文件的大小,內核不做限制),soft limit最大能是unlimited。

hard limit

在資源中只是作為soft limit的上限。當你設置hard limit后,你以后設置的soft limit只能小於hard limit。
要說明的是,hard limit只針對非特權進程,也就是進程的有效用戶ID(effective user ID)不是0的進程。具有特權級別的進程(具有屬性CAP_SYS_RESOURCE),
soft limit則只有內核上限。

 

ulimit -c -n -s
ulimit -c -n -s -H
[root@fp-web-112 src]# ulimit -c -n -s
core file size          (blocks, -c) 0
open files                      (-n) 1024
stack size              (kbytes, -s) 8192
  
[root@fp-web-112 src]# ulimit -c -n -s -H
core file size (blocks, -c) unlimited
open files (-n) 4096
stack size (kbytes, -s) unlimited

-H表示顯示的是hard limit。從結果上可以看出soft limit和hard limit的區別。unlimited表示no limit, 即內核的最大值。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM