在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 torlimit.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的时候
转载请注明出处谢谢