资源控制
有时候系统提供的某些资源的默认值不是我们想要的,所以需要对它们进行控制,我们能够使用getrlimit和setrlimit两个函数来获取和设置。
int getrlimit(int resource, struct rlimit *rlp); int setrlimit(int resource, const struct rlimit *rlp)
资源限制分为软限制和硬限制。软限制可以背一个进程改变,但是不能大于硬限制。硬限制只能被降低,但是必须大于软限制。想要提高硬限制,必须是超级用户。
资源包括有:core文件的最大字节数(RLIMIT_CORE)、CPU的最大量值(RLIMIT_CPU)、文件的最大字节长度(RLIMIT_FSIZE)、进程能打开的最大文件数(RLIMIT_NOFILE)、栈的最大字节数(RLIMIT_STACK)。例如如果想要设置进程能打开的最大文件数,其代码如下:
int set_nofile(rlim_t limit) { struct rlimit r; getrlimit(RLIMIT_NOFILE, &r); r.rlim_cur = limit; setrlimit(RLIMIT_NOFILE, &r); return 0; }
其中,rlim_t 是struct rlimit结构体中的一部分:
struct limit { rlim_t rlim_cur; //soft limit rlim_t rlim_max; //hard limit };
对set_nofile加上容错信息:
int set_nofile(rlim_t limit) { struct rlimit r; if(getrlimit(RLIMIT_NOFILE, &r) < 0) { LOG(LOG_LEVEL_WARN, "function getrlimit fail. "); return -1; } if(limit>r.rlim_max) { LOG(LOG_LEVEL_WARN, "limit should not be greater than %lu.",r.rlim_max); return -1; } r.rlim_cur = limit; if(setrlimit(RLIMIT_NOFILE, &r)<0) { LOG(LOG_LEVEL_WARN, "function setrlimit fail."); return -1; } return 0; }