曲径通幽论坛

标题: getrlimit()/setrlimit() -- 获取/设置系统资源限制数 [打印本页]

作者: beyes    时间: 2012-6-6 13:55
标题: getrlimit()/setrlimit() -- 获取/设置系统资源限制数
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 的其它选项类似使用。




欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2