進程在運行時,會占用計算機的各種資源,比如CPU時間、內(nèi)存、文件等等。但是,進程是不可以占用無限多的資源的,操作系統(tǒng)會給進程設(shè)定所使用資源的上限。想獲取這些資源的上限值,是需要調(diào)用getrlimit()即可。
int getrlimit(int resource, struct rlimit *rlptr);
第一個參數(shù)是資源,有哪些資源呢?
資源 |
粗略含義 |
RLIMIT_AS |
進程可使用的內(nèi)存的最大值 |
RLIMIT_CORE |
核心文件(core file)的最大值 |
RLIMIT_CPU |
CPU時間最大值 |
RLIMIT_DATA |
數(shù)據(jù)段(已初始化數(shù)據(jù)+未初始化數(shù)據(jù)+堆)的最大值 |
RLIMIT_FSIZE |
新建文件的最大字節(jié)數(shù) |
RLIMIT_LOCKS |
持有的鎖的最大數(shù) |
RLIMIT_MEMLOCK |
鎖定內(nèi)存的最大字節(jié)數(shù) |
RLIMIT_NOFILE |
打開文件的最大數(shù)目 |
RLIMIT_NPROC |
每個實際用戶(real user)的最大子進程數(shù)目 |
RLIMIT_RSS |
RSS(Resident Set Size)的最大字節(jié)數(shù) |
RLIMIT_SBSIZE |
socket buffer的最大字節(jié)數(shù) |
RLIMIT_STACK |
進程棧的最大字節(jié)數(shù) |
RLIMIT_VMEM |
與RLIMIT_AS含義一致 |
第二個參數(shù)是rlimit,rlimit結(jié)構(gòu)是這樣的:
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');
}
運行的結(jié)果:
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