Linux系統(tǒng)調(diào)用--getrlimit()與setrlimit()函數(shù)詳解

功能描述:

獲取或設(shè)定資源使用限制第喳。每種資源都有相關(guān)的軟硬限制盒延,軟限制是內(nèi)核強(qiáng)加給相應(yīng)資源的限制值飞蚓,硬限制是軟限制的最大值滤港。非授權(quán)調(diào)用進(jìn)程只可以將其軟限制指定為0~硬限制范圍中的某個(gè)值,同時(shí)能不可逆轉(zhuǎn)地降低其硬限制趴拧。授權(quán)進(jìn)程可以任意改變其軟硬限制溅漾。RLIM_INFINITY的值表示不對(duì)資源限制。

用法:

#include <sys/resource.h>
int getrlimit(int resource, struct rlimit *rlim);
int setrlimit(int resource, const struct rlimit *rlim);

參數(shù)

resource:可能的選擇有

取值 功能
RLIMIT_AS 進(jìn)程的最大虛內(nèi)存空間著榴,字節(jié)為單位樟凄。
RLIMIT_CORE 內(nèi)核轉(zhuǎn)存文件的最大長(zhǎng)度
RLIMIT_CPU 最大允許的CPU使用時(shí)間,秒為單位兄渺。當(dāng)進(jìn)程達(dá)到軟限制缝龄,內(nèi)核將給其發(fā)送SIGXCPU信號(hào)汰现,這一信號(hào)的默認(rèn)行為是終止進(jìn)程的執(zhí)行。然而叔壤,可以捕捉信號(hào)瞎饲,處理句柄可將控制返回給主程序。如果進(jìn)程繼續(xù)耗費(fèi)CPU時(shí)間炼绘,核心會(huì)以每秒一次的頻率給其發(fā)送SIGXCPU信號(hào)嗅战,直到達(dá)到硬限制,那時(shí)將給進(jìn)程發(fā)送 SIGKILL信號(hào)終止其執(zhí)行俺亮。
RLIMIT_DATA 進(jìn)程數(shù)據(jù)段的最大值
RLIMIT_FSIZE 進(jìn)程可建立的文件的最大長(zhǎng)度驮捍。如果進(jìn)程試圖超出這一限制時(shí),核心會(huì)給其發(fā)送SIGXFSZ信號(hào)脚曾,默認(rèn)情況下將終止進(jìn)程的執(zhí)行东且。
RLIMIT_LOCKS 進(jìn)程可建立的鎖和租賃的最大值
RLIMIT_MEMLOCK 進(jìn)程可鎖定在內(nèi)存中的最大數(shù)據(jù)量,字節(jié)為單位本讥。
RLIMIT_MSGQUEUE 進(jìn)程可為POSIX消息隊(duì)列分配的最大字節(jié)數(shù)
RLIMIT_NICE 進(jìn)程可通過setpriority() 或 nice()調(diào)用設(shè)置的最大完美值
RLIMIT_NOFILE 指定比進(jìn)程可打開的最大文件描述詞大一的值珊泳,超出此值,將會(huì)產(chǎn)生EMFILE錯(cuò)誤
RLIMIT_NPROC 用戶可擁有的最大進(jìn)程數(shù)
RLIMIT_RTPRIO 進(jìn)程可通過sched_setscheduler 和 sched_setparam設(shè)置的最大實(shí)時(shí)優(yōu)先級(jí)
RLIMIT_SIGPENDING 用戶可擁有的最大掛起信號(hào)數(shù)
RLIMIT_STACK 最大的進(jìn)程堆棧拷沸,以字節(jié)為單位色查。

rlim:描述資源軟硬限制的結(jié)構(gòu)體,原型如下

struct rlimit {
  rlim_t rlim_cur;
  rlim_t rlim_max;
};

返回說(shuō)明:
成功執(zhí)行時(shí)撞芍,返回0秧了。失敗返回-1,errno被設(shè)為以下的某個(gè)值
EFAULT:rlim指針指向的空間不可訪問
EINVAL:參數(shù)無(wú)效
EPERM:增加資源限制值時(shí)序无,權(quán)能不允許

ulimit和setrlimit修改task進(jìn)程資源上限值

在linux系統(tǒng)中验毡,Resouce limit指在一個(gè)進(jìn)程的執(zhí)行過程中,它所能得到的資源的限制愉镰,比如進(jìn)程的core file的最大值米罚,虛擬內(nèi)存的最大值等钧汹。
Resouce limit的大小可以直接影響進(jìn)程的執(zhí)行狀況丈探。其有兩個(gè)最重要的概念:soft limit 和 hard limit

struct rlimit {
  rlim_t rlim_cur;  //soft limit
  rlim_t rlim_max;  //hard limit
};

soft limit是指內(nèi)核所能支持的資源上限拔莱。比如對(duì)于RLIMIT_NOFILE(一個(gè)進(jìn)程能打開的最大文件數(shù)碗降,內(nèi)核默認(rèn)是1024),soft limit最大也只能達(dá)到1024塘秦。對(duì)于RLIMIT_CORE(core文件的大小讼渊,內(nèi)核不做限制),soft limit最大能是unlimited尊剔。

hard limit在資源中只是作為soft limit的上限爪幻。當(dāng)你設(shè)置hard limit后,你以后設(shè)置的soft limit只能小于hard limit。要說(shuō)明的是挨稿,hard limit只針對(duì)非特權(quán)進(jìn)程仇轻,也就是進(jìn)程的有效用戶ID(effective user ID)不是0的進(jìn)程。具有特權(quán)級(jí)別的進(jìn)程(具有屬性CAP_SYS_RESOURCE)奶甘,soft limit則只有內(nèi)核上限篷店。

我們可以來(lái)看一下下面兩條命令的輸出。

[gaps@localhost:0]$ ulimit -c -n -s
core file size          (blocks, -c) unlimited
open files                      (-n) 1024
stack size              (kbytes, -s) 10240
[gaps@localhost:0]$ ulimit -c -n -s -H
core file size          (blocks, -c) unlimited
open files                      (-n) 4096
stack size              (kbytes, -s) unlimited

-H表示顯示的是hard limit臭家。從結(jié)果上可以看出soft limit和hard limit的區(qū)別疲陕。unlimited表示no limit, 即內(nèi)核的最大值。

對(duì)于resouce limit的讀取修改钉赁,有兩種方法蹄殃。

  • 使用shell內(nèi)建命令ulimit
  • 使用getrlimit和setrlimit API

ulimit是改變shell的resouce limit,并達(dá)到改變shell啟動(dòng)的進(jìn)程的resouce limit效果(子進(jìn)程繼承)橄霉。

usage:ulimit [-SHacdefilmnpqrstuvx [limit]]

當(dāng)不指定limit的時(shí)候窃爷,該命令顯示當(dāng)前值。這里要注意的是姓蜂,當(dāng)你要修改limit的時(shí)候按厘,如果不指定-S或者-H,默認(rèn)是同時(shí)設(shè)置soft limit和hard limit钱慢。也就是之后設(shè)置時(shí)只能減不能增逮京。所以,建議使用ulimit設(shè)置limit參數(shù)是加上-S束莫。

getrlimit和setrlimit的使用也很簡(jiǎn)單懒棉,manpage里有很清楚的描述。

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

需要注意的是你在setrlimit,需要檢查是否成功來(lái)判斷新值有沒有超過hard limit览绿。如下例Linux系統(tǒng)中在應(yīng)用程序運(yùn)行過程中經(jīng)常會(huì)遇到程序突然崩潰策严,提示:Segmentation fault,這是因?yàn)閼?yīng)用程序收到了SIGSEGV信號(hào)饿敲。這個(gè)信號(hào)提示當(dāng)進(jìn)程發(fā)生了無(wú)效的存儲(chǔ)訪問妻导,當(dāng)接收到這個(gè)信號(hào)時(shí),缺省動(dòng)作是:終止w/core怀各。終止w/core的含義是:在進(jìn)程當(dāng)前目錄生成core文件倔韭,并將進(jìn)程的內(nèi)存映象復(fù)制到core文件中,core文件的默認(rèn)名稱就是“core”(這是 Unix類系統(tǒng)的一個(gè)由來(lái)已久的功能)瓢对。

事實(shí)上寿酌,并不是只有SIGSEGV信號(hào)產(chǎn)生coredump,還有下面一些信號(hào)也產(chǎn)生coredump:SIGABRT(異常終止)硕蛹、SIGBUS(硬件故障)醇疼、SIGEMT(硬件故障)硕并、SIGFPE(算術(shù)異常)明吩、SIGILL(非法硬件指令)棋傍、SIGIOT(硬件故障),SIGQUIT结胀,SIGSYS(無(wú)效系統(tǒng)調(diào)用)辰如,SIGTRAP(硬件故障)等普监。

對(duì)于resouce limit的讀取修改,有兩種方法琉兜。

  • 使用shell內(nèi)建命令ulimit
  • 使用getrlimit和setrlimit APIsetrlimit:
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);
  }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末凯正,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子豌蟋,更是在濱河造成了極大的恐慌廊散,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件梧疲,死亡現(xiàn)場(chǎng)離奇詭異允睹,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)幌氮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門缭受,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人该互,你說(shuō)我怎么就攤上這事米者。” “怎么了宇智?”我有些...
    開封第一講書人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵蔓搞,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我随橘,道長(zhǎng)喂分,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任机蔗,我火速辦了婚禮蒲祈,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蜒车。我一直安慰自己讳嘱,他們只是感情好幔嗦,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開白布酿愧。 她就那樣靜靜地躺著,像睡著了一般邀泉。 火紅的嫁衣襯著肌膚如雪嬉挡。 梳的紋絲不亂的頭發(fā)上钝鸽,一...
    開封第一講書人閱讀 52,441評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音庞钢,去河邊找鬼拔恰。 笑死,一個(gè)胖子當(dāng)著我的面吹牛基括,可吹牛的內(nèi)容都是我干的颜懊。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼风皿,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼河爹!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起桐款,我...
    開封第一講書人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤咸这,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后魔眨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體媳维,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年遏暴,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了侄刽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡朋凉,死狀恐怖唠梨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情侥啤,我是刑警寧澤当叭,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站盖灸,受9級(jí)特大地震影響蚁鳖,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜赁炎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一醉箕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧徙垫,春花似錦讥裤、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至吴旋,卻和暖如春损肛,著一層夾襖步出監(jiān)牢的瞬間厢破,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工治拿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留摩泪,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓劫谅,卻偏偏與公主長(zhǎng)得像见坑,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子捏检,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容