進程在運行時,會占用計算機的各種資源,比如CPU時間、內存、文件等等。但是,進程是不可以占用無限多的資源的,操作系統會給進程設定所使用資源的上限。想獲取這些資源的上限值,是需要調用getrlimit()即可。
int getrlimit(int resource, struct rlimit *rlptr);
第一個參數是資源,有哪些資源呢?
資源 | 粗略含義 |
RLIMIT_AS |
進程可使用的內存的最大值 |
RLIMIT_CORE |
核心文件(core file)的最大值 |
RLIMIT_CPU |
CPU時間最大值 |
RLIMIT_DATA |
數據段(已初始化數據+未初始化數據+堆)的最大值 |
RLIMIT_FSIZE |
新建文件的最大字節數 |
RLIMIT_LOCKS |
持有的鎖的最大數 |
RLIMIT_MEMLOCK |
鎖定內存的最大字節數 |
RLIMIT_NOFILE |
打開文件的最大數目 |
RLIMIT_NPROC |
每個實際用戶(real user)的最大子進程數目 |
RLIMIT_RSS |
RSS(Resident Set Size)的最大字節數 |
RLIMIT_SBSIZE |
socket buffer的最大字節數 |
RLIMIT_STACK |
進程棧的最大字節數 |
RLIMIT_VMEM |
與RLIMIT_AS含義一致 |
第二個參數是rlimit,rlimit結構是這樣的:
struct rlimit
{
rlim_t rlim_cur; /* soft limit: current limit */
rlim_t rlim_max; /* hard limit: maximum value for rlim_cur */
};
其中含有軟限制和硬限制。超級用戶可以增加硬限制;一般用戶可以降低硬限制,但不能增加硬限制,一般用戶還可修改軟限制,但修改的軟限制不能超過硬限制。
實際運行的效果如何呢?實踐一下吧!
#include <stdio.h> #include <sys/resource.h> #define doit(name) pr_limit(#name, name) void pr_limit(char* name, int resource); int main () { printf("resource name soft\thard \n"); #ifdef RLIMIT_AS doit(RLIMIT_AS); #endif doit(RLIMIT_CORE); doit(RLIMIT_CPU); doit(RLIMIT_DATA); doit(RLIMIT_FSIZE); #ifdef RLIMIT_LOCKS doit(RLIMIT_LOCKS); #endif #ifdef RLIMIT_MEMLOCK doit(RLIMIT_MEMLOCK); #endif doit(RLIMIT_NOFILE); #ifdef RLIMIT_NPROC doit(RLIMIT_NPROC); #endif #ifdef RLIMIT_RSS doit(RLIMIT_RSS); #endif #ifdef RLIMIT_SBSIZE doit(RLIMIT_SBSIZE); #endif doit(RLIMIT_STACK); #ifdef RLIMIT_VMEM doit(RLIMIT_VMEM); #endif return 0; } void pr_limit(char* name, int resource) { struct rlimit limit; if ( getrlimit(resource, &limit) < 0 ) { printf("getrlimit error!\n"); return; } printf("%-14s ", name); if ( limit.rlim_cur == RLIM_INFINITY ) printf("infinite "); else printf("%8ld ", limit.rlim_cur); if ( limit.rlim_max == RLIM_INFINITY ) printf("infinite "); else printf("%8ld ", limit.rlim_max); putchar('\n'); }
運行的結果:
resource name soft hard RLIMIT_AS infinite infinite RLIMIT_CORE 0 infinite RLIMIT_CPU infinite infinite RLIMIT_DATA infinite infinite RLIMIT_FSIZE infinite infinite RLIMIT_LOCKS infinite infinite RLIMIT_MEMLOCK 65536 65536 RLIMIT_NOFILE 1024 1024 RLIMIT_NPROC infinite infinite RLIMIT_RSS infinite infinite RLIMIT_STACK 8388608 infinite