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

Posted 浅墨浓香

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第5章 进程环境_进程资源限制相关的知识,希望对你有一定的参考价值。

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

 

以上是关于第5章 进程环境_进程资源限制的主要内容,如果未能解决你的问题,请参考以下文章

第5章 进程环境_环境表和环境变量

第5章 进程环境_进程结构(task_struct)

第5章 进程环境_非局部跳转

第5章 死锁

第11章进程间通信_管道

第3章 进程同步