getrlimit Unix系統函數

來源:互聯網
上載者:User

Unix系統函數

名稱

  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

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.