1、getrlimit和setrlimit
#include <sys/resource.h> // 獲取或設置指定資源的使用限制 int getrlimit(int resource, struct rlimit *rlim); int setrlimit(int resource, const struct rlimit *rlim);
每種資源都有相應的軟限制和硬限制,如以下結構所定義的:
struct rlimit { rlim_t rlim_cur; // 軟限制。任何進程可將它設置為0~rlim_max rlim_t rlim_max; // 硬限制(軟限制的上限) };
普通進程只能不可逆地降低它的硬限制(且不能小於軟限制)。超級用戶進程或具有CAP_SYS_RESOURCE能力的進程可以隨意改變它的兩個限制值。
RLIM_INFINITY值表示在一個資源上沒有使用限制。在某些系統實現上,rlim_t是8字節無符號整數,而RLIM_INFINITY就是rlim_t類型的最大值。
resource參數的常用值:
RLIMIT_AS:進程虛擬內存(地址空間,Address Space)的最大字節長度。該限制會影響brk、mmap和mremap等。
RLIMIT_CORE:core文件的最大字節長度。超出這個大小的core文件會被截短。指定0則表示不產生core文件。
RLIMIT_CPU:CPU時間的使用限制(秒)。進程達到軟限制時,會收到一個SIGXCPU信號(默認會終止進程。但進程可以捕獲該信號)。如果進程繼續消耗CPU時間,它會每秒收到一個SIGXCPU信號,直到達到硬限制,並接收到SIGKILL信號(不同的實現在此處可能會有差別)。
RLIMIT_DATA:進程數據段(初始化數據節、未初始化數據節和堆)的最大字節長度。該限制會影響brk和sbrk等。
RLIMIT_FSIZE:進程所能創建的文件的最大字節長度。
RLIMIT_LOCKS:進程可創建的flock鎖和fcntl租借鎖的總數(租借鎖是Linux特有的:fcntl可通過F_SETLEASE命令對文件加讀或寫的租借鎖。當另一個進程嘗試打開或截短該文件而產生沖突時,內核會通過信號通知持有租借鎖的進程。后者應當對此作出響應,如flush緩沖區或移除租借鎖等)。
RLIMIT_MEMLOCK:進程使用mlock能夠鎖定在RAM中的最大字節長度(防止被換出到交換分區。內存的鎖定和解鎖以頁為單位)。該限制會影響mlock、mlockall和mmap等。
RLIMIT_MSGQUEUE:調用進程的實際用戶所能分配的Posix消息隊列的最大字節長度。
RLIMIT_NOFILE:進程所能打開(如使用open/pipe/socket)的文件描述符的最大值加1。注意,進程間的文件描述符是獨立的。超出該限制會拋出EMFILE錯誤。
RLIMIT_NPROC:調用進程的實際用戶所能創建進程(在Linux上,更准確的說法是線程)的最大數目。超出該限制時,fork會失敗並拋出EAGAIN錯誤。
RLIMIT_STACK:進程的棧的最大字節長度。超出該限制會收到SIGSEGV信號。
2、ulimit:獲取或設置指定資源的使用限制。
進程的資源限制通常是在系統初始化時由init進程建立的,然后由每個后續進程繼承。這就意味着為了影響一個用戶的所有后續進程,需要將資源限制的設置構造在shell之中(如bash中的ulimit)。
1)常用選項:-H:指定硬限制,一般與其他選項一起使用;-S:指定軟限制,一般與其他選項一起使用;-a:列出所有的限制值;-c:core文件的最大大小;-f:此shell及其子進程可建立的文件的最大大小;-d:進程數據段的最大大小;-l:可鎖定內存的最大大小;-t:可用的最大CPU時間;-u:單一用戶所能創建的最大進程數。
不斷學習中。。。