程序在運作時,會占用計算機的各種資源,比如CPU時間、記憶體、檔案等等。但是,程序是不可以占用無限多的資源的,作業系統會給程序設定所使用資源的上限。想擷取這些資源的上限值,是需要調用getrlimit()即可。int getrlimit(int resource, struct rlimit *rlptr);
第一個參數是資源,有哪些資源呢?
資源
粗略含義
RLIMIT_AS
程序可使用的記憶體的最大值
RLIMIT_CORE
核心檔案(core file)的最大值
RLIMIT_CPU
CPU時間最大值
RLIMIT_DATA
資料段(已初始化資料+未初始化資料+堆)的最大值
RLIMIT_FSIZE
建立檔案的最大位元組數
RLIMIT_LOCKS
持有的鎖的最大數
RLIMIT_MEMLOCK
鎖定記憶體的最大位元組數
RLIMIT_NOFILE
打開檔案的最大數目
RLIMIT_NPROC
每個實際使用者(real user)的最大子程序數目
RLIMIT_RSS
RSS(Resident Set Size)的最大位元組數
RLIMIT_SBSIZE
socket buffer的最大位元組數
RLIMIT_STACK
程序棧的最大位元組數
RLIMIT_VMEM
與RLIMIT_AS含義一緻
第二個參數是rlimit,rlimit結構是這樣的:
struct rlimit
{
rlim_t rlim_cur;
rlim_t rlim_max;
};
其中含有軟限制和硬限制。超級使用者可以增加硬限制;一般使用者可以降低硬限制,但不能增加硬限制,一般使用者還可修改軟限制,但修改的軟限制不能超過硬限制。
實際運作的效果如何呢?實踐一下吧!#include
#include
#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');
}
運作的結果:resource name softhard
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