《unix高级环境编程》进程环境——进程资源限制

       每个进程都有一组资源限制,其中一些可以使用getrlimit和setrlimit函数进行查询和修改。进程的资源限制是在系统初始化时由进程0建立的,然后由每个后续进程继承,每种实现都可以用自己的方法对各种限制做出调整。

       getrlimit和setrlimit函数

/* 进程资源限制 */

/* 查询和修改进程资源 */
/*
 * 函数功能:查询或修改进程资源;
 * 返回值:若成功则返回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 */
};
在更改资源限制时,必须遵循下列三条规则:

  1. 任何进程都可将一个软限制值更改为小于或者等于其硬限制值。
  2. 任何一个进程都可以降低其硬限制值,但它必须大于等于其软限制值。这种降低对普通用户来说是不可逆的。
  3. 只有超级用户进程可以提高硬限制值。
这两个函数的resource参数是下列参数值之一:

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高级环境编程》

你可能感兴趣的:(Unix高级环境编程,getrlimit函数,setrlimit函数,进程资源限制)