rlimit Linux下限製資源的使用(Limiting Resource Usage)
在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的時候
轉載請注明出處謝謝
最後更新:2017-04-03 12:55:41