#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, 即內核的最大值。