rlimit Linux下限制资源的使用(Limiting Resource Usage)

来源:互联网 发布:格式化的数据恢复 编辑:程序博客网 时间:2024/06/05 07:09

在Linux环境编程下,我们可以具体的限制一个进程对资源的使用,当进程尝试超过资源使用的限制,它可能会收到一个信号,或是因资源而失败的系统调用。每个进程最初的获得的限制来自父进程,但是后来可以更改这个限制。

有两个关于资源限制的概念:

current limit:为系统规定的上限,也叫做"soft limit",因为进程通常将被限制在这个范围内。

maxinum limit:为一个进程被允许建立current limit的最大值,也叫做"hard limit",因为一个进程无法避开它,一个进程低于他自己的maxinum limit,且只有超级用户可能提高它的maxinum limit。

struct rlimit {
rlim_t rlim_cur;//The current limit 
rlim_t rlim_max;//The maximum limit.
};

使用getrlimit,setrlimit,getrlimit64,setrlimit64(定义在<sys/resource.h>)来对上面两个值进行使用。

— Function: int getrlimit (int resource, struct rlimit *rlp)

   读取类型为resource的限制值,并储存在rlp中。

   返回值为0时成功,-1时失败。失败时可能将errno设置为EFAULT.

— Function: int setrlimit (int resource, const struct rlimit *rlp)

更新新的current limit 与 maxinum limit限制 ,参数resource为限制的类型(下方有参数表),*rlp带更新的结构体。

同样成功返回0,失败返回-1.将errno设置为EPERM有如下两种情况

1.设置的current limit 超过了maxinum limit的值。

    2.在不是超级用户的情况下设置了maxinum limit。

同时这里只提到

struct rlimit64{

rlim64_t rlim_cur;

//This is analogous to rlimit.rlim_cur, but with a different type. 
rlim64_t rlim_max
//This is analogous to rlimit.rlim_max, but with a different type.

}

下面是具体可以限制的种类也就是resource列表

RLIMIT_CPU   CPU使用时间限制,如果运行时间长于该值,将会收到信号:SIGXCPU 该值以秒计量

RLIMIT_FSIZE   进程可创建文件大小限制,如果进程尝试写更大的文件将会受到信号:SIGXFSZ

RLIMIT_DATA   最大内存使用限制,如果进程尝试分配内存并超出这个范围,分配函数将会失败

RLIMIT_STACK   进程使用栈的大小限制,如果进程尝试扩展它的栈并超过这个值,那个会收到信号SIGSEGV 

RLIMIT_CORE   进程创建core文件大小限制,如果进程结束并且要存储core文件高于该值,那么core文件不会被创建,所以设置这个值为0回保证core文件从不被创建

RLIMIT_RSS   进程所能得到的最大物理内存,这个参数是系统调度程序和内存分配的向导,系统在有盈余时将会给进程更多的内存

RLIMIT_MEMLOCK   在物理内存中最大被锁内存数

RLIMIT_NPROC   同一用户ID创建最大进程数,如果已经到达最大进程数再调用fork会失败

RLIMIT_NOFILE
RLIMIT_OFILE   进程可开最大文件数,如果超出最大数将会失败,该值存在在GNU 和 4.4BSD,部分系统没有。
RLIMIT_AS   进程总共可获得的最大内存数,如果进程尝试分配更多内存,那么分配函数将会失败。
RLIM_NLIMITS   所有参数值的限制,以上任何参数值都不能高于该值

— Constant: rlim_t RLIM_INFINITY
该常量被定义为无穷,在调用setrlimit的时候


转载请注明出处谢谢

9 1