【c++】getrlimit和setrlimit 两个函数详解
参考:https://blog.csdn.net/test1280/article/details/80465082/
C/C++:进程资源限制函数(getrlimit、setrlimit)&& Shell-ulimit命令
进程在操作系统内核中是一个独立存在的运行实体。
每个进程都有 一组 资源限制,限制进程对于系统资源的申请量。
- 可以通过 getrlimit 来获取当前进程某一指定资源的限制。
- 可以通过 setrlimit 来设置当前进程某一指定资源的限制。
- 进程的资源限制通常是在系统初始化时由0进程建立的,然后后续进程继承。
即:进程的资源限制,是继承自fork当前进程的那个进程—父进程。
#include <sys/time.h> #include <sys/resource.h> int getrlimit(int resource, struct rlimit *rlim); int setrlimit(int resource, const struct rlimit *rlim); struct rlimit { lim_t rlim_cur; /* Soft limit */ rlim_t rlim_max; /* Hard limit (ceiling for rlim_cur) */ };
从 rlimit 的结构可以看出,每个进程每种资源限制分为两种:1)硬限制;2)软限制;
在设置进程的资源限制时,有三条规则:
1)进程可以将某资源的软限制值更改为小于或等于其硬限制值;
2)任何一个进程可以降低某资源的硬限制值,但必须大于等于对应资源的软限制值,且这种“降低”对于非root用户是不可逆的;
3)只有root用户进程可以提高硬限制值;
资源限制有多种,我列举下比较常用,比较关心的几类:
- RLIMIT_CORE:进程core时,core文件最大字节数(单位字节),若其值为0则不创建core文件。
- RLIMIT_FSIZE:每个进程可创建的文件的最大字节长度(单位字节)。
- RLIMIT_NOFILE:每个进程能打开的最大文件数目。
- RLIMIT_NPROC:每个实际用户ID可拥有的最大子进程数目。
- RLIMIT_AS //进程的最大虚内存空间,字节为单位。
- RLIMIT_CORE //内核转存文件的最大长度。
- RLIMIT_CPU //最大允许的CPU使用时间,秒为单位。当进程达到软限制,内核将给其发送SIGXCPU信号,这一信号的默认行为是终止进程的执行。然而,可以捕捉信号,处理句柄可将控制返回给主程序。如果进程继续耗费CPU时间,核心会以每秒一次的频率给其发送SIGXCPU信号,直到达到硬限制,那时将给进程发送 SIGKILL信号终止其执行。
- RLIMIT_DATA //进程数据段的最大值。
- RLIMIT_FSIZE //进程可建立的文件的最大长度。如果进程试图超出这一限制时,核心会给其发送SIGXFSZ信号,默认情况下将终止进程的执行。
- RLIMIT_LOCKS //进程可建立的锁和租赁的最大值。
- RLIMIT_MEMLOCK //进程可锁定在内存中的最大数据量,字节为单位。
- RLIMIT_MSGQUEUE //进程可为POSIX消息队列分配的最大字节数。
- RLIMIT_NICE //进程可通过setpriority() 或 nice()调用设置的最大完美值。
- RLIMIT_NOFILE //指定比进程可打开的最大文件描述词大一的值,超出此值,将会产生EMFILE错误。
- RLIMIT_NPROC //用户可拥有的最大进程数。
- RLIMIT_RTPRIO //进程可通过sched_setscheduler 和 sched_setparam设置的最大实时优先级。
- RLIMIT_SIGPENDING //用户可拥有的最大挂起信号数。
- RLIMIT_STACK //最大的进程堆栈,以字节为单位。
功能描述:
获取或设定资源使用限制。每种资源都有相关的软硬限制,软限制是内核强加给相应资源的限制值,硬限制是软限制的最大值。非授权调用进程只可以将其软限制指定为0~硬限制范围中的某个值,同时能不可逆转地降低其硬限制。授权进程可以任意改变其软硬限制。RLIM_INFINITY的值表示不对资源限制。
用法:
#include <sys/resource.h> int getrlimit(int resource, struct rlimit *rlim); int setrlimit(int resource, const struct rlimit *rlim);
参数:
resource:可能的选择有
- RLIMIT_AS //进程的最大虚内存空间,字节为单位。
- RLIMIT_CORE //内核转存文件的最大长度。
- RLIMIT_CPU //最大允许的CPU使用时间,秒为单位。当进程达到软限制,内核将给其发送SIGXCPU信号,这一信号的默认行为是终止进程的执行。然而,可以捕捉信号,处理句柄可将控制返回给主程序。如果进程继续耗费CPU时间,核心会以每秒一次的频率给其发送SIGXCPU信号,直到达到硬限制,那时将给进程发送 SIGKILL信号终止其执行。
- RLIMIT_DATA //进程数据段的最大值。
- RLIMIT_FSIZE //进程可建立的文件的最大长度。如果进程试图超出这一限制时,核心会给其发送SIGXFSZ信号,默认情况下将终止进程的执行。
- RLIMIT_LOCKS //进程可建立的锁和租赁的最大值。
- RLIMIT_MEMLOCK //进程可锁定在内存中的最大数据量,字节为单位。
- RLIMIT_MSGQUEUE //进程可为POSIX消息队列分配的最大字节数。
- RLIMIT_NICE //进程可通过setpriority() 或 nice()调用设置的最大完美值。
- RLIMIT_NOFILE //指定比进程可打开的最大文件描述词大一的值,超出此值,将会产生EMFILE错误。
- RLIMIT_NPROC //用户可拥有的最大进程数。
- RLIMIT_RTPRIO //进程可通过sched_setscheduler 和 sched_setparam设置的最大实时优先级。
- RLIMIT_SIGPENDING //用户可拥有的最大挂起信号数。
- RLIMIT_STACK //最大的进程堆栈,以字节为单位。
rlim:描述资源软硬限制的结构体,原型如下
struct rlimit {
rlim_t rlim_cur;
rlim_t rlim_max;
};
返回说明:
成功执行时,返回0。失败返回-1,errno被设为以下的某个值
EFAULT:rlim指针指向的空间不可访问
EINVAL:参数无效
EPERM:增加资源限制值时,权能不允许