天天看点

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