天天看點

linux api 程序狀态,Linux API 實踐:擷取程序資源限制

程序在運作時,會占用計算機的各種資源,比如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