程序資源限制

2021-09-02 21:01:38 字數 3147 閱讀 1629

每個程序都有一組資源限制,程序的資源限制通常是在系統初始化時由 0 程序建立的,然後由後續程序繼承。每種實現都可以用自己的方法對資源限制做出調整。可以使用 getrlimit 和 setrlimit 函式來查詢和修改程序的資源限制。

#include

int getrlimit(int resource, struct rlimit *rlptr);

int setrlimit(int resource, const struct rlimit *rlptr);

/* 返回值:若成功,都返回 0;否則,都返回非 0 */

struct rlimit;

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

(1)任何乙個程序都可將乙個軟限制值更改為小於或等於其硬限制值。

(2)任何乙個程序都可降低其硬限制值,但必須不小於其軟限制值。這種降低對普通使用者而言是不可逆的。

(3)只有超級使用者程序可以提高硬限制值。

常量 rlim_infinity 指定了乙個無限量的限制。

下圖顯示了 resource 引數的可選值中哪些是由 single unix specification 定義以及常用unix 系統的支援情況。

[img]

其中各個值的說明如下。

* rlimit_as:程序總的可用儲存空間的最大長度(位元組)。這影響到 sbrk 函式和 mmap 函式。

* rlimit_core:core 檔案的最大位元組數,若其值為 0 則阻止建立 core 檔案。

* rlimit_cpu:cpu 時間的最大量值(秒),當超過此軟限制時,向程序傳送 sigxcpu 訊號。

* rlimit_data:資料段的最大位元組長度。這是初始化資料、非初始化以及堆的總和。

* rlimit_fsize:可以建立的檔案的最大位元組長度。當超過此軟限制時,則向該程序傳送 sigxfsz 訊號。

* rlimit_memlock:乙個程序使用 mlock(2) 能夠鎖定在儲存空間中的最大位元組長度。

* rlimit_msqqueue:程序為 posix 訊息佇列可分配的最大儲存位元組數。

* rlimit_nice:為了影響程序的排程優先順序,nice 值可設定的最大限制。

* rlimit_nofile:每個程序能開啟的最多檔案數。更改此限制將影響到 sysconf 函式在引數 _sc_open_max 中返回的值。

* rlimit_nproc:每個實際使用者 id 可擁有的最大子程序數。更改此限制將影響到 sysconf 函式在引數 _sc_child_max 中返回的值。

* rlimit_npts:使用者可同時開啟的偽終端的最大數量。

* rlimit_rss:最大駐記憶體集位元組長度(resident set size in bytes,rss)。如果可用的物理儲存器非常少,則核心將從程序處取回超過 rss 的部分。

* rlimit_sbsize:在任一給定時刻,乙個使用者可以占用的套接字緩衝區的最大長度(位元組)。

* rlimit_sigpending:乙個程序可排隊的訊號最大數量。這個限制是 sigqueue 函式實施的。

* rlimit_stack:棧的最大位元組長度。

* rlimit_swap:使用者可消耗的交換空間的最大位元組數。

* rlimit_vmem:rlimit_as 的同義詞。

資源限制影響到呼叫程序並由其子程序繼承。這意味著,為了影響乙個使用者的所有後續程序,需要將資源限制的設定構造在 shell 中,比如 bourne shell、gnu bourne-again shell 和 kom shell 就具有內建的 ulimit 命令,c shell 具有內建的 limit 命令。

下列程式列印由系統支援的所有資源當前的軟限制和硬限制(注意,有些平台定義 rlim_t 為 unsigned long long 而非 unsigned long。有些限制作用於檔案大小,因此 rlim_t 型別必須足夠大才能表示檔案大小限制。為了避免使用錯誤的格式說明而導致編譯器警告,通常會首先把限制複製到 64 位整型,這樣只需處理一種格式)。

#include

#include

#include

#define doit(name) pr_limits(#name, name);

static void pr_limits(char *, int);

int main(void)

static void pr_limits(char *name, int resource)

printf("%-14s ", name);

if(limit.rlim_cur == rlim_infinity)else

if(limit.rlim_max == rlim_infinity)else

putchar((int)'\n');

}

注意,在 doit 巨集中使用了 iso c 的字串建立運算子「#」,以便為每個資源名產生字串值。

linux 系統上的執行結果如下。

$ ./resourcelimit.out

rlimit_as (infinite) (infinite)

rlimit_core 0 (infinite)

rlimit_cpu (infinite) (infinite)

rlimit_data (infinite) (infinite)

rlimit_fsize (infinite) (infinite)

rlimit_memlock 65536 65536

rlimit_msgqueue 819200 819200

rlimit_nice 0 0

rlimit_nofile 65535 65535

rlimit_nproc 1024 65535

rlimit_rss (infinite) (infinite)

rlimit_sigpending 3810 3810

rlimit_stack 10485760 (infinite)

Linux程序資源限制

在linux系統下啟動執行乙個程序時,可對該程序執行時可占用的資源進行限制。程序的資源限制通常是在系統初始化時由init程序建立的,然後後續程序繼承。用法 include int getrlimit int resource,struct rlimit rlim int setrlimit int ...

linux程序資源限制

linux程序可分為前台程序 後台程序 守護程序 前台程序 後台程序沒有脫離shell,其父程序都為shell程序,其資源限制也繼承至相應shell程序,可用ulimit工具修改其資源限制 ulimit a 檢視當前shell所有資源限制 ulimit n 檢視當前shell能開啟的檔案總數 參考文...

限制程序使用的資源

getrlimit和setrlimit函式 每個程序都有一組資源限制,其中某一些可以用getrlimit和setrlimit函式查詢和更改。include include int getrlimit int resource,struct rlimit rlptr int setrlimit int...