zoukankan      html  css  js  c++  java
  • 第5章 进程环境(4)_进程资源限制

    5. 进程资源限制

    (1)getrlimit、setrlimit函数

    头文件

    #include<sys/resource.h>

    函数

    int* getrlimit(int resource, struct rlimit* rlptr);

    返回值

    成功返回0,出错返回非0

    功能

    获得资源限制,存放在rlptr指向的结构体中

    参数

    (1)rlimit结构体

    struct rlimit{
        rlim_t  rlim_cur;    //软限制:当前限制
        rlim_t  rlim_max;  //硬限制:rlim_cur的最大值
    }

    (2)resource的取值:见后面的表格。

     

    函数

    int setrlimit(int resource, const struct rlimit* rlptr);

    返回值

    成功返回0,出错返回非0

    功能

    通过rlptr指向的结构体去修改resource指定的资源限制

    备注

    资源限制影响到调用进程并由其子进程继承。

    (2)resource取值

    作用

    RLIMIT_AS

    进程可用存储区大小

    RLIMIT_CORE

    core文件最大字节数

    RLIMIT_CPU

    CPU时间最大值

    RLIMIT_DATA

    数据段最大长度

    RLIMIT_FSIZE

    可创建文件的最大长度。当超过此软限制时,则向该进程发送SIGXFSZ信号

    RLIMIT_LOCKS

    文件锁的最大数

    RLIMIT_MEMLOCK

    使用mlock能够锁定在存储器中的最长字节数

    RLIMIT_NOFILE

    能打开的最大文件数

    RLIMIT_NPROC

    每个用户ID可拥有的最大子进程数

    RLIMIT_RSS

    最大驻内存集的字节长度

    RLIMIT_STACT

    栈的最大长度

    【编程实验】显示进程资源限制情况

    //process_limit.c

    #include <sys/resource.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    #define RLIMIT(name)   get_limit(#name, name);
    
    void get_limit(char* name, int resource)
    {
        struct rlimit limit;
        if(getrlimit(resource, &limit) < 0){
            perror("getrlimit error");
            return;
        }
    
        printf("%-15s", name);  //左对齐打印资源的名字
        //rlmit_cur:软资源限制
        if(limit.rlim_cur == RLIM_INFINITY){
            printf("    infinity");  //无限制
        }else{
            printf("%10ld", limit.rlim_cur);
        }
        //rlimit_max:硬资源限制
        if(limit.rlim_max == RLIM_INFINITY){
            printf("    infinity");  //无限制
        }else{
            printf("%10ld", limit.rlim_max);
        }
        printf("
    ");
    }
    
    int main(int argc, char* argv[])
    {
        RLIMIT(RLIMIT_AS);       //进程可用存储区大小
        RLIMIT(RLIMIT_CORE);     //core文件最大字节数
        RLIMIT(RLIMIT_CPU);      //CPU时间最大值
        RLIMIT(RLIMIT_DATA);     //数据段最大长度
        RLIMIT(RLIMIT_FSIZE);    //可创建文件的最大长度
        RLIMIT(RLIMIT_LOCKS);    //文件锁的最大数
        RLIMIT(RLIMIT_MEMLOCK);  //使用mlock能在存储器中锁定的最长字节数
        RLIMIT(RLIMIT_NOFILE);   //能打开的最大文件数
        RLIMIT(RLIMIT_NPROC);    //每个用户ID可拥有的最大子进程数
        RLIMIT(RLIMIT_RSS);      //最大驻内存集的字节长度
        RLIMIT(RLIMIT_STACK);    //栈的最大长度
        
        return 0;
    }

    (3)进程资源限制的配置文件

      ①/etc/security/limits.conf

      ②Linux中进程资源的初始化由0号进程建立被后续进程继承

    (4)资源限制的修改规则

      ①硬资源限制必须大于等于软资源限制

      ②任何一进程可以降低或者提升其软资源限制,但必须小于等于硬资源限制

      ③任何一进程可以降低其硬资源限制,但必须大于其软限制,普通户不可逆此操作。

      ④只有超级用户可以提高硬限制

    【编程实验】限制进程打开文件的最大数量

    //limit_nofile.c

    #include <unistd.h>
    #include <sys/resource.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <fcntl.h>
    
    #define MODE S_IRWXU | S_IRWXG | S_IRWXO
    
    int open_file(const char* filename)
    {
        int fd = open(filename, O_RDWR | O_CREAT | O_TRUNC, MODE);
        if(fd < 0){
            perror("open error");
            exit(1);
        }
    
        return fd;
    }
    
    int main(int argc, char* argv[])
    {
        struct rlimit limit;
        limit.rlim_cur = 4;     //设置软资源限制
        limit.rlim_max = 1024;  //设置硬资源限制
    
        //设置进程打开文件的最大数
        //(注:0==>标准输入 1==标准输出 2==>标准错误 己打开)
        if(setrlimit(RLIMIT_NOFILE, &limit) < 0){
            perror("setrlimit error");
            exit(1);
        }
    
        //打开文件
        int fd1, fd2;
        fd1 = open_file("s1.txt"); //正常打开
        if(fd1 < 0){
            exit(1);
        }
    
        fd2 = open_file("s2.txt");//超过软资源限制指定的4个文件,则报错。
        if(fd2 < 0){
            exit(1);
        }
    
        close(fd1);
        close(fd2);
        
        return 0;
    }
  • 相关阅读:
    zoj 1239 Hanoi Tower Troubles Again!
    zoj 1221 Risk
    uva 10192 Vacation
    uva 10066 The Twin Towers
    uva 531 Compromise
    uva 103 Stacking Boxes
    稳定婚姻模型
    Ants UVA
    Golden Tiger Claw UVA
    关于upper、lower bound 的探讨
  • 原文地址:https://www.cnblogs.com/5iedu/p/6354483.html
Copyright © 2011-2022 走看看