进程在运行时,会占用计算机的各种资源,比如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; /* soft limit: current limit */
rlim_t rlim_max; /* hard limit: maximum value for rlim_cur */
};
其中含有软限制和硬限制。超级用户可以增加硬限制;一般用户可以降低硬限制,但不能增加硬限制,一般用户还可修改软限制,但修改的软限制不能超过硬限制。
实际运行的效果如何呢?实践一下吧!
#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');
}
运行的结果:
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