第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("\n");
}

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;
}

 

原文链接: https://www.cnblogs.com/5iedu/p/6354483.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    第5章 进程环境(4)_进程资源限制

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/393658

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年4月3日 下午3:17
下一篇 2023年4月3日 下午3:18

相关推荐