linux中g(shù)etrlimit和setrlimit系統(tǒng)調(diào)用用法

功能描述

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容