每个进程都有一组资源限制,其中一些可以使用getrlimit和setrlimit函数进行查询和修改。进程的资源限制是在系统初始化时由进程0建立的,然后由每个后续进程继承,每种实现都可以用自己的方法对各种限制做出调整。
/* 进程资源限制 */ /* 查询和修改进程资源 */ /* * 函数功能:查询或修改进程资源; * 返回值:若成功则返回0,若出错则返回非0值; * 函数原型: */ #include <sys/resource.h> int getrlimit(int resource, struct rlimit *rlptr);//查询进程资源 int setrlimit(int resource, const struct rlimit *rlptr);//修改进程资源对这两个函数的每一次调用都会制定一个资源以及一个指向下列结构的指针。
/* * rlimit 结构信息如下: */ struct rlimit { rlimit_t rlimit_cur; /* soft limit: current limit */ rlimit_t rlimit_max; /* hard limit: maximum value for rlimit_cur */ };在更改资源限制时,必须遵循下列三条规则:
RLIMIT_AS: 进程可用存储区的最大总长度(字节)。 RLIMIT_CORE: core文件的最大字节数,若其值为0则阻止创建core文件。 RLIMIT_CPU: CPU时间的最大值(秒),当超过此软限制时,向该进程发送SIGXCPU信号。 RLIMIT_DATA: 数据段的最大字节长度。 RLIMIT_FSIZE: 可以创建的文件的最大字节长度。当超过此软限制时,则向该进程发送SIGXFSZ信号。 RLIMIT_LOCKS: 一个进程可持有的文件锁的最大数。 RLIMIT_MEMLOCK:一个进程使用mlock能够锁定在存储器中的最大字节长度。 RLIMIT_NOFILE: 每个进程能打开最大文件数。更改此限制将影响到sysconf函数在参数_SC_OPEN_MAX返回的值。 RLIMIT_NPROC: 每个实际用户ID可拥有的最大子进程数。更改此限制将影响到sysconf函数在参数_SC_CHILD_MAX返回的值。 RLIMIT_RSS: 最大驻内存集的字节长度。(resident set size in bytes,RSS) RLIMIT_SBSIZE: 用户在任一给定时刻可以占用的套接字缓冲区的最大长度。 RLIMIT_STACK: 栈的最大字节长度。 RLIMIT_VMEM: 这是RLIMT_AS的同义词。测试测序:
#include <stdio.h> #include "apue.h" #include <sys/resource.h> static void pr_limits(char *,int); int main(void) { pr_limits("RLIMIT_CORE",RLIMIT_CORE); pr_limits("RLIMIT_CPU",RLIMIT_CPU); pr_limits("RLIMIT_AS",RLIMIT_AS); pr_limits("RLIMIT_DATA",RLIMIT_DATA); pr_limits("RLIMIT_FSIZE",RLIMIT_FSIZE); pr_limits("RLIMIT_MEMLOCK",RLIMIT_MEMLOCK); pr_limits("RLIMIT_NOFILE",RLIMIT_NOFILE); pr_limits("RLIMIT_LOCKS",RLIMIT_LOCKS); pr_limits("RLIMIT_RSS",RLIMIT_RSS); pr_limits("RLIMIT_NPROC",RLIMIT_NPROC); pr_limits("RLIMIT_STACK",RLIMIT_STACK); exit(0); } static void pr_limits(char* name, int resource){ struct rlimit limit; if(getrlimit(resource, &limit) <0) err_sys("getrlimit error for %s",name); printf("%-14s ",name); if(limit.rlim_cur == RLIM_INFINITY) printf("(infinite) "); else printf("%-14ld",limit.rlim_cur); if(limit.rlim_max == RLIM_INFINITY) printf("(infinite) "); else printf("%-14ld",limit.rlim_max); printf("\n"); }输出结果:
RLIMIT_CORE 0 (infinite) RLIMIT_CPU (infinite) (infinite) RLIMIT_AS (infinite) (infinite) RLIMIT_DATA (infinite) (infinite) RLIMIT_FSIZE (infinite) (infinite) RLIMIT_MEMLOCK 65536 65536 RLIMIT_NOFILE 1024 4096 RLIMIT_LOCKS (infinite) (infinite) RLIMIT_RSS (infinite) (infinite) RLIMIT_NPROC 30742 30742 RLIMIT_STACK 8388608 (infinite)参考资料:
《unix高级环境编程》