進(jìn)程在運(yùn)行時(shí),會(huì)占用計(jì)算機(jī)的各種資源,比如CPU時(shí)間、內(nèi)存、文件等等。但是,進(jìn)程是不可以占用無限多的資源的,操作系統(tǒng)會(huì)給進(jìn)程設(shè)定所使用資源的上限。想獲取這些資源的上限值,是需要調(diào)用getrlimit()即可。
int getrlimit(int resource, struct rlimit *rlptr);
第一個(gè)參數(shù)是資源,有哪些資源呢?
| 資源 | 粗略含義 |
|
RLIMIT_AS |
進(jìn)程可使用的內(nèi)存的最大值 |
|
RLIMIT_CORE |
核心文件(core file)的最大值 |
|
RLIMIT_CPU |
CPU時(shí)間最大值 |
|
RLIMIT_DATA |
數(shù)據(jù)段(已初始化數(shù)據(jù)+未初始化數(shù)據(jù)+堆)的最大值 |
|
RLIMIT_FSIZE |
新建文件的最大字節(jié)數(shù) |
|
RLIMIT_LOCKS |
持有的鎖的最大數(shù) |
|
RLIMIT_MEMLOCK |
鎖定內(nèi)存的最大字節(jié)數(shù) |
|
RLIMIT_NOFILE |
打開文件的最大數(shù)目 |
|
RLIMIT_NPROC |
每個(gè)實(shí)際用戶(real user)的最大子進(jìn)程數(shù)目 |
|
RLIMIT_RSS |
RSS(Resident Set Size)的最大字節(jié)數(shù) |
|
RLIMIT_SBSIZE |
socket buffer的最大字節(jié)數(shù) |
|
RLIMIT_STACK |
進(jìn)程棧的最大字節(jié)數(shù) |
|
RLIMIT_VMEM |
與RLIMIT_AS含義一致 |
第二個(gè)參數(shù)是rlimit,rlimit結(jié)構(gòu)是這樣的:
struct rlimit
{
rlim_t rlim_cur; /* soft limit: current limit */
rlim_t rlim_max; /* hard limit: maximum value for rlim_cur */
};
其中含有軟限制和硬限制。超級(jí)用戶可以增加硬限制;一般用戶可以降低硬限制,但不能增加硬限制,一般用戶還可修改軟限制,但修改的軟限制不能超過硬限制。
實(shí)際運(yùn)行的效果如何呢?實(shí)踐一下吧!
#include <stdio.h> #include <sys/resource.h> #define doit(name) pr_limit(#name, name) void pr_limit(char* name, int resource); int main () { printf("resource name soft\thard \n"); #ifdef RLIMIT_AS doit(RLIMIT_AS); #endif doit(RLIMIT_CORE); doit(RLIMIT_CPU); doit(RLIMIT_DATA); doit(RLIMIT_FSIZE); #ifdef RLIMIT_LOCKS doit(RLIMIT_LOCKS); #endif #ifdef RLIMIT_MEMLOCK doit(RLIMIT_MEMLOCK); #endif doit(RLIMIT_NOFILE); #ifdef RLIMIT_NPROC doit(RLIMIT_NPROC); #endif #ifdef RLIMIT_RSS doit(RLIMIT_RSS); #endif #ifdef RLIMIT_SBSIZE doit(RLIMIT_SBSIZE); #endif doit(RLIMIT_STACK); #ifdef RLIMIT_VMEM doit(RLIMIT_VMEM); #endif return 0; } void pr_limit(char* name, int resource) { struct rlimit limit; if ( getrlimit(resource, &limit) < 0 ) { printf("getrlimit error!\n"); return; } printf("%-14s ", name); if ( limit.rlim_cur == RLIM_INFINITY ) printf("infinite "); else printf("%8ld ", limit.rlim_cur); if ( limit.rlim_max == RLIM_INFINITY ) printf("infinite "); else printf("%8ld ", limit.rlim_max); putchar('\n'); }
運(yùn)行的結(jié)果:
resource name soft hard RLIMIT_AS infinite infinite RLIMIT_CORE 0 infinite RLIMIT_CPU infinite infinite RLIMIT_DATA infinite infinite RLIMIT_FSIZE infinite infinite RLIMIT_LOCKS infinite infinite RLIMIT_MEMLOCK 65536 65536 RLIMIT_NOFILE 1024 1024 RLIMIT_NPROC infinite infinite RLIMIT_RSS infinite infinite RLIMIT_STACK 8388608 infinite


