getrlimit()函式

2puT發表於2016-07-20

getrlimit,中文名為Unix系統函式,應用於電腦系統。
中文名
Unix系統函式
外文名
getrlimit
類    型
軟體程式設計
領    域
電腦系統

簡介

編輯
getrlimit,setrlimit - 控制系統資源的最大使用量。[1-2] 

大綱

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

描述

編輯
在作業系統中,我們能夠通過函式getrlimit()、setrlimit()分別獲得、設定每個程式能夠建立的各種系統資源的限制使用量。
呼叫getrlimit()或者setrlimit()來操作指定資源的操作上限。資源限制是一對值:一個指定了當前(軟)限制,另一個則代表一個最大(硬)限制。軟限制能夠被一個程式改變,只要保證它不大於硬限制。一個程式能夠(不能夠撤回的)降低它的硬體限制,前提是大於等於軟限制。僅當一個程式工作在一個系統超級使用者許可權下時能夠提高它的硬體限制。呼叫setrlimit()來改變硬限制和軟限制。限制值可能是一個“無窮大”值:RLIM_INFINITY。引數rlp是一個指向結構體rlimit的指標,該結構體包含如下成員:
rlim_t rlim_cur; /*當前(軟)限制*/
rlim_t rlim_max; /*硬限制*/
型別rlim_t是一個算術資料型別,等同於型別int,size_t,和off_t。
資源限制型別概要描述如下:
RLIMIT_CORE
core檔案的最大位元組數,若其值為0則阻止建立core檔案。
RLIMIT_CPU
CPU時間的最大量值(秒),當超過此軟限制時,向該程式傳送S I G X C P U訊號。
RLIMIT_DATA
一個程式的資料段最大位元組長度。資料段中初始化資料、非初始化資料以及堆的總和。當呼叫函式brk動態改變一個程式的資料段大小時,若失敗,errno值將被設定為ENOMEM。
RLIMIT_FSIZE
可以建立的檔案的最大位元組長度。當超過此軟限制時,則向該程式傳送SIGXFSZ訊號。
RLIMIT_NOFILE
每個程式能開啟的最多檔案數。
RLIMIT_STACK
棧的最大位元組長度。系統不會動態增加棧的大小限制。
在程式內部,setrlimit()將增加限制以適合您的棧大小,而不會移動當前記憶體段來允許增長。為了保證程式的棧能夠增長,限制必須首先改變以適應執行程式使用的新棧大小。
在一個多執行緒的程式中,若線上程中呼叫setrlimit(),而該執行緒不是主執行緒,則對於棧的限制沒有任何改變。使用引數RLIMIT_STACK來呼叫setrlimit()僅僅能夠影響主執行緒的棧,並且該工作本來就應該由主執行緒來完成。
當超越棧大小限制時,訊號SIGSEGV會發給程式。如果程式忽略該訊號,或者捕捉該訊號但是沒有設定處理措施,該訊號預設設定為SIG_DFL處理方案。
RLIMIT_VMEM
可映照地址空間的最大位元組長度。
RLIMIT_AS
程式可用記憶體最大位元組數。
因為限制資訊儲存在每個程式的資訊中,shell建立限制命令必須直接呼叫這兩個系統函式來影響該shell以後建立的所有程式。
下面資源當前限制的值會影響相對應巨集定義的展開。
限制 巨集定義展開
RLIMIT_FSIZE FCHR_MAX
RLIMIT_NOFILE OPEN_MAX
當使用函式getrlimit(),如果一個資源限制能夠被正確賦值為型別rlim_t,則該值將被返回;否則,如果該資源限制等同於相應的硬體限制,返回值是RLIM_SAVED_MAX;否則返回值是RLIM_SAVED_CUR。
當使用函式setrlimit(),如果請求新的限制值為RLIM_INFINITY,新的限制將是“無限制”;否則如果請求的新的限制為RLIM_SAVED_MAX,新的限制將被儲存為硬體限制;如果請求的新的限制為RLIM_SAVED_CUR,新的限制將被儲存為軟限制;否則新的限制將賦值為請求的值。另外,如果相應傳入的限制值正確,則該限制將作為新的限制值。
設定一個限制為RLIM_SAVED_MAX或者RLIM_SAVED_CUR的結果是未知的,除非在之前呼叫getrlimit以瞭解相應的軟限制或者硬限制值。
一個限制允許其值大於RLIM_INFINITY。

返回值

編輯
成功完成後,getrlimit()和setrlimit()返回0。否則,返回-1並設定errno指定相應錯誤。

錯誤

編輯
函式getrlimit()和函式setrlimit()失敗情況如下:
EFAULT
引數rlp指向非法地址。
EINVAL
指定了一個無效的資源;或者在呼叫函式setrlimit()時新的rlim_cur值超過了新的rlim_max值。
EPERM
呼叫函式setrlimit試圖增加最大限制值,但該程式並不屬於超級使用者
函式setrlimit可能失敗情況:
EINVAL
指定的限制值不能去減低限制值因為當前用法已經大於該指定限制值。

相關文章