曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 10205|回复: 0
打印 上一主题 下一主题

[文件I/O] getrlimit()/setrlimit() -- 获取/设置系统资源限制数

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34397
跳转到指定楼层
楼主
发表于 2012-6-6 13:55:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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 的其它选项类似使用。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-6-17 23:03 , Processed in 0.097110 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表