第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章 进程环境_进程资源限制的主要内容,如果未能解决你的问题,请参考以下文章