Linux rlimit 函数详解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/rikeyone/article/details/88798384

简介

每个进程在运行时系统不会无限制的允许单个进程不断的消耗资源,因此都会设置资源限制。Linux系统中使用resource limit来表示,每个进程都可以设置不同的资源限制,当前进程和其以后fork的子进程会遵循此限制,而其他进程不受当前进程条件的影响。

ulimit命令

ulimit是一个shell内建的命令:

ulimit 是 shell 内建

通过该命令,我们可以设置当前shell环境中的一些资源限制值,这些设置会影响到该shell和由该shell中运行的其余命令,对于不相关的其他shell进程不受影响。

$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 127633
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 127633
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

相关的资源限制命令选项如上所示,比如可以使用ulimit -c 1来使当前shell环境下的进程产生core文件,并且core文件大小限制在1个block。

getrlimit和setrlimit系统API

#include <sys/resource.h>

int getrlimit(int resource, struct rlimit *rlptr);
int setrlimit(int resource, const struct rlimit *rlptr);

进程的资源限制由系统在启动时进程0初始化,后续进程从进程0处继承,各个进程之后都可以利用上述两个API获取和重新设置进程资源限制。

struct rlimit {
	rlim_t rlim_cur; //current limit
	rlim_t rlim_max; //max limit value for "rlim_cur"
};

对应的resource参数可选如下:

RLIMIT_AS/RLIMIT_VMEM: 这两个资源表示的是同一个含义,都是只address space限制,可用内存用户地址空间最大长度,会影响到sbrk和mmap函数。
RLIMIT_STACK:栈的长度,默认一般是8K
RLIMIT_CORE:程序crash后生成的core dump文件的大小,如果为0将不生成对应的core文件。
RLIMIT_NOFILE:进程能够打开的最多文件数目,此限制会影响到sysconf的_SC_OPEN_MAX的返回值。
RLIMIT_NPROC:每个用户ID能够拥有的最大子进程数目,此限制会影响到sysconf的_SC_CHILD_MAX的返回值。
RLIMIT_NICE:对应进程的优先级nice值。
RLIMIT_SWAP:进程能够消耗的最大swap空间。
RLIMIT_CPU:CPU时间的最大值(秒单位),超过此限制后会发送SIGXCPU信号给进程。
RLIMIT_DATA:数据段的最大长度。默认为unlimited
RLIMIT_FSIZE:创建文件的最大字节长度。默认为ulimited
RLIMIT_MSGQUEUE:为posix消息队列可分配的最大存储字节数
RLIMIT_SIGPENDING:可排队的信号最大数量
RLIMIT_NPTS:可同时打开的伪终端数目
RLIMIT_RSS:最大可驻内存字节长度
RLIMIT_SBSIZE:单个用户所有套接字缓冲区的最大长度
RLIMIT_MEMLOCK:一个进程使用mlock能够锁定存储空间中的最大字节长度

最后还有一点,如果读取和设置的rlimit中的值为RLIM_INFINITY宏,那么表示是无限制,unlimited。

猜你喜欢

转载自blog.csdn.net/rikeyone/article/details/88798384
今日推荐