功能描述
getrlimit獲取或設(shè)定資源使用限制,setrlimit設(shè)置資源使用限制
每種資源都有相關(guān)的軟硬限制,軟限制是內(nèi)核強加給相應資源的限制值,硬限制是軟限制的最大值。非授權(quán)調(diào)用進程只可以將其軟限制指定為0~硬限制范圍中的某個值,同時能不可逆轉(zhuǎn)地降低其硬限制。授權(quán)進程可以任意改變其軟硬限制。
RLIM_INFINITY的值表示不對資源限制。
使用
頭文件
#include <sys/resource.h>
函數(shù)原型
int getrlimit(int resource, struct rlimit *rlim);
int setrlimit(int resource, const struct rlimit *rlim);
參數(shù):
rlim:描述資源軟硬限制的結(jié)構(gòu)體,原型如下
struct rlimit {
rlim_t rlim_cur;????? //soft limit
rlim_t rlim_max;??? //hard limit
};
soft limit是指內(nèi)核所能支持的資源上限。比如對于RLIMIT_NOFILE(一個進程能打開的最大文件數(shù),內(nèi)核默認是1024),soft limit最大也只能達到1024。對于RLIMIT_CORE(core文件的大小,內(nèi)核不做限制),soft limit最大能是unlimited。
hard limit在資源中只是作為soft limit的上限。當你設(shè)置hard limit后,你以后設(shè)置的soft limit只能小于hard limit。要說明的是,hard limit只針對非特權(quán)進程,也就是進程的有效用戶ID(effective user ID)不是0的進程。具有特權(quán)級別的進程(具有屬性CAP_SYS_RESOURCE),soft limit則只有內(nèi)核上限。
resource:可能的選擇有
RLIMIT_AS?//進程的最大虛內(nèi)存空間,字節(jié)為單位。
RLIMIT_CORE?//內(nèi)核轉(zhuǎn)存文件的最大長度。
RLIMIT_CPU?//最大允許的CPU使用時間,秒為單位。當進程達到軟限制,內(nèi)核將給其發(fā)送SIGXCPU信號,這一信號的默認行為是終止進程的執(zhí)行。然而,可以捕捉信號,處理句柄可將控制返回給主程序。如果進程繼續(xù)耗費CPU時間,核心會以每秒一次的頻率給其發(fā)送SIGXCPU信號,直到達到硬限制,那時將給進程發(fā)送 SIGKILL信號終止其執(zhí)行。
RLIMIT_DATA?//進程數(shù)據(jù)段的最大值。
RLIMIT_FSIZE?//進程可建立的文件的最大長度。如果進程試圖超出這一限制時,核心會給其發(fā)送SIGXFSZ信號,默認情況下將終止進程的執(zhí)行。
RLIMIT_LOCKS?//進程可建立的鎖和租賃的最大值。
RLIMIT_MEMLOCK?//進程可鎖定在內(nèi)存中的最大數(shù)據(jù)量,字節(jié)為單位。
RLIMIT_MSGQUEUE?//進程可為POSIX消息隊列分配的最大字節(jié)數(shù)。
RLIMIT_NICE?//進程可通過setpriority() 或 nice()調(diào)用設(shè)置的最大完美值。
RLIMIT_NOFILE?//指定比進程可打開的最大文件描述詞大一的值,超出此值,將會產(chǎn)生EMFILE錯誤。
RLIMIT_NPROC?//用戶可擁有的最大進程數(shù)。
RLIMIT_RTPRIO?//進程可通過sched_setscheduler 和 sched_setparam設(shè)置的最大實時優(yōu)先級。
RLIMIT_SIGPENDING?//用戶可擁有的最大掛起信號數(shù)。
RLIMIT_STACK?//最大的進程堆棧,以字節(jié)為單位。
返回值
成功執(zhí)行時,返回0。失敗返回-1,errno被設(shè)為以下的某個值
EFAULT:rlim指針指向的空間不可訪問
EINVAL:參數(shù)無效
EPERM:增加資源限制值時,權(quán)能不允許
常用設(shè)置舉例
比如設(shè)置core file
struct rlimit rlim_new,rlim;
if (getrlimit(RLIMIT_CORE, &rlim)==0) {
rlim_new.rlim_cur = rlim_new.rlim_max = RLIM_INFINITY;
if (setrlimit(RLIMIT_CORE, &rlim_new)!=0) {
rlim_new.rlim_cur = rlim_new.rlim_max = rlim.rlim_max;
(void) setrlimit(RLIMIT_CORE, &rlim_new);
}
}
設(shè)置file_max
#include <stdio.h>
#include <sys/resource.h>
int main()
{
? ? ? ? rlimit r1,r2;
? ? ? ? rlimit tmp={4095,4096};
? ? ? ? getrlimit(RLIMIT_NOFILE,&r1);
? ? ? ? printf("rlim_cur=%d,rlim_max=%d\n",r1.rlim_cur,r1.rlim_max);
? ? ? ? setrlimit(RLIMIT_NOFILE,&tmp);
? ? ? ? getrlimit(RLIMIT_NOFILE,&r2);
? ? ? ? printf("rlim_cur=%d,rlim_max=%d\n",r2.rlim_cur,r2.rlim_max);
? ? ? ? return 0;
}
測試結(jié)果
[root@localhost test]# ./a.out
rlim_cur=1024,rlim_max=4096
rlim_cur=4095,rlim_max=4096