getrlimit

getrlimit,中文名為Unix系統函式,套用於電腦系統。

簡介

getrlimit,setrlimit - 控制系統資源的最大使用量。

大綱

#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

指定的限制值不能去減低限制值因為當前用法已經大於該指定限制值。

相關詞條

相關搜尋

熱門詞條

聯絡我們