getrlimit和setrlimit 獲得linux下面的進程可用資源

來源:互聯網
上載者:User

 

getrlimit和setrlimit函數
  每個進程都有一組資源限制,其中某一些可以用getrlimit和setrlimit函數查詢和更改。

#include
#include
int getrlimit(int resource,struct rlimit *rlptr);
int setrlimit(int resource,const struct rlimit rlptr);
Both return: 0 if OK,nonzero on error兩個函數

  返回:若成功為0,出錯為非0

  對這兩個函數的每一次調用都指定一個資源以及一個指向下列結構的指標。

struct rlimit{
rlim rlim ur;/* 軟式節流:當前限制 */
rlim rlim ax;/* 硬限制:rlimcur的最大值 */
};

  這兩個函數不屬於POSIX.1,但SVR4和4.3+BSD提供它們。SVR4在上面的結構中使用基本系統資料類型rlim。其它系統則將這

兩個成員定義為整型或長整型。

  進程的資源限制通常是在系統初啟時由0#進程建立的,然後由後續進程繼承。在SVR4中,系統預設值可以查看文

件/etc/conf/cfd/mtune在4.3+BSD中,系統預設值分散在多個標頭檔中。

  在更改資源限制時,須遵循下列三條規則:

  1.任何一個進程都可將一個軟式節流更改為小於或等於其硬限制。
  2.任何一個進程都可降低其硬限制值,但它必須大於或等於其軟式節流值。這種降低,對普通使用者而言是無法復原反的。
  3.只有超級使用者可以提高硬限制。

  一個無限量的限制由常數RLIM NFINITY指定。

  這兩個函數的resource參數取下列值之一。注意並非所有資源限制都受到SVR4和4.3+BSD的支援。

  RLMITCORE(SVR4及4.3+BSD)core檔案的最大位元組數,若其值為0則阻止建立core檔案。
  RLIMIT PU(SVR4及4.3+BSD)CPU時間的最大量值(秒),當超過此軟限止時,向該進程發送SIGXCPU訊號。
  RLIMIT ATA(SVR4及4.3+BSD)資料區段的最大位元組長度。這是圖7.3中初始化資料、非初始化資料以及堆的總和。
  RLIMIT SIZE(SVR4及4.3+BSD)可以建立的一個檔案的最大位元組長度。當超過此軟式節流時,則向該進程發送SIGFSZ訊號。
  RLIMIT EMLOCK(4.3+BSD)鎖定在儲存空間地址空間(尚末實現)。
  RLIMIT OFILE(SVR4)每個進程最多開啟的檔案數。更改此限制將影響到sysconf函數在參數-sc-OPEN-MAX中返回的值(2.5.4節

)。見程式2.3。
  RLIMIT PROC(4.3+BSD)每個實際使用者ID所擁有的最大子進程數。更改此限制將影響到sysconf函數在參數 CHILDMAX中返回的

值(2.5.4節)。
  RLIMIT FILE(4.3+BSD)與SVR4的RLIMIT OFILE相同。
  RLIMIT SS(4.3+BSD)最大駐記憶體集位元組長度(RSS)。如果實體儲存體器供子應求,則系統核將從進程處取回超過RSS的部分。
  RLIMIT TACK(SVR4及4.3+BSD)棧的最大位元組長度。見圖7.3。
  RLIMIT MEM(SVR4)可映照地址空間的最大位元組長度。這影響到mmap函數(12.9節)。

  資源限制影響到調用進程並由其子進程繼承。這就意味著為了影響一個使用者的所有後續進程,需將資源限制設定構造在shell

之中。確實,Bourne Shell和Kornshell具有內部ulimit命令,CShell具有內部limit命令。(umask和chdir也必須是shell內部的)

  較早的BourmeShell,例如由貝克萊提供的一種,不支援ulimit命令。較新的KornShell的ulimit命令具有-H和-s選擇項,以

分別檢查和修改硬和軟的限制,但它們尚末編寫入文檔。

?

?簡單的用例:

#include<sys/time.h>
#include<sys/resource.h>
#include<unistd.h>
int main()
{
  struct rlimit limit;
 char p = '1';
 limit.rlim_cur = RLIM_INFINITY;
 limit.rlim_max = RLIM_INFINITY;
 if(setrlimit(RLIMIT_CORE, &limit))
 {
  printf("set limit failed/n");
 }

 printf("p = %s/n",p);

---------------------------------------------------------------------------------------------------------------------------------------------

對每個進程都有一組資源限制,其中一些可以用getrlimit和setrlimit函數查詢和更改

getrlimit和setrlimit:資源限制 (getrlimit and setrlimit: Resource Limits)

  • 這兩個系統函數是和resource limit相關的。你用過ulimit命令嗎?(反正我沒用過)
  • 對於每個資源來說有兩個limit:一個是hard limit,一個是soft limit,其中後者永遠不能超過前者,並且只有擁有superuser許可權的進程可以更改前者。
  • getrlimit和setrlimit的參數相同:第一個參數是資源的類型,第二個參數是rlimit結構的指標,這個結構裡面就只有兩個成員:hard limit和soft limit
  • 幾個重要的資源類型
    • RLIMIT_CPU:程式執行的最大CPU時間,單位是秒。超過之後程式中止,中止的訊號是SIGXCPU
    • RLIMIT_DATA:程式執行的最大記憶體
    • RLIMIT_NPROC:程式孵出的最大子進程數量
    • RLIMIT_NOFILE:程式開啟的檔案的最大數量
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.