资源控制

  有时候系统提供的某些资源的默认值不是我们想要的,所以需要对它们进行控制,我们能够使用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;
}

 

posted on 2017-05-14 21:19  残余的光  阅读(444)  评论(0编辑  收藏  举报

导航