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;
    }
  • 相关阅读:
    vue+elemnet 实现自定义参数
    css 实现鼠标移上去标题向右滑动的效果
    vue 搜索关键字列表结果高亮显示
    leaflet 实现 测距、测面、清除测量的功能
    js对象的合并
    formdata的使用方法
    fromdata上传多个文件
    3.11formdata的使用
    微信小程序的自定义插件
    3.6
  • 原文地址:https://www.cnblogs.com/5iedu/p/6354483.html
Copyright © 2011-2022 走看看