getrlimit() 和 setrlimit() 函数分别用来获取和设置系统资源的限制数。系统资源的限制数分为软限制和硬限制两种。软限制是内核给相应的资源数限定的一个值,而硬限制则相当于软限制的一个“天花板”,也就是说,软限制数可以从 0 到所设定的 “软限制数”,但这个软限制数不能超过硬限制数。比如说,一个非特权进程可以打开的文件描述符的硬限制数为 10,那么软限制数可以设定在大于等于 0 而小于 10 之间的一个数,而不能大于 10 。一个特权进程则可以强制改变这两个值。
两个函数分别定义如下:
[C++] 纯文本查看 复制代码 #include <sys/time.h>
#include <sys/resource.h>
int getrlimit(int resource, struct rlimit *rlim);
int setrlimit(int resource, const struct rlimit *rlim);
其中 struct rlimit 结果定义为:
[C++] 纯文本查看 复制代码 struct rlimit {
rlim_t rlim_cur; /* Soft limit */
rlim_t rlim_max; /* Hard limit (ceiling for rlim_cur) */
};
结构中,第一个成员为当前的软限制,第二个成员表示硬限制。
函数中,第一个参数是一些特定类型值,具体参考 man 手册。
测试代码:
[C++] 纯文本查看 复制代码 #include <stdio.h>
#include <sys/time.h>
#include <sys/resource.h>
int main()
{
struct rlimit limits;
/* RLIMIT_NOFILE 表示一个进程可以打开的最大文件描述符数 */
if ( getrlimit( RLIMIT_NOFILE, &limits) == 0 ) {
if (limits.rlim_cur == RLIM_INFINITY)
printf ("RLIMIT_NOFILE Soft Limit is infinite\n");
else
printf ("RLIMIT_NOFILE soft limit: %lld\n", (long long int)limits.rlim_cur);
if ( limits.rlim_max == RLIM_INFINITY )
printf ("RLIMIT_NOFILE Hard Limit is infinite\n");
else
printf ("RLIMIT_NOFILE hard limit: %lld\n", (long long int)limits.rlim_max);
}
printf ("Now, use setrlimit() function to change this limit.\n");
limits.rlim_max = 8192;
(void) setrlimit(RLIMIT_NOFILE, &limits);
limits.rlim_cur = 8192;
(void) setrlimit(RLIMIT_NOFILE, &limits);
if ( getrlimit( RLIMIT_NOFILE, &limits) == 0 ) {
if (limits.rlim_cur == RLIM_INFINITY)
printf ("RLIMIT_NOFILE Soft Limit is infinite\n");
else
printf ("RLIMIT_NOFILE soft limit: %lld\n", (long long int)limits.rlim_cur);
if ( limits.rlim_max == RLIM_INFINITY )
printf ("RLIMIT_NOFILE Hard Limit is infinite\n");
else
printf ("RLIMIT_NOFILE hard limit: %lld\n", (long long int)limits.rlim_max);
}
return 0;
}
运行输出:# ./getsetrlimit
RLIMIT_NOFILE soft limit: 1024
RLIMIT_NOFILE hard limit: 1024
Now, use setrlimit() function to change this limit.
RLIMIT_NOFILE soft limit: 8192
RLIMIT_NOFILE hard limit: 8192 两个函数中第一个参数 source 的其它选项类似使用。 |