Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4823317
  • 博文数量: 930
  • 博客积分: 12070
  • 博客等级: 上将
  • 技术积分: 11448
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-15 16:57
文章分类

全部博文(930)

文章存档

2011年(60)

2010年(220)

2009年(371)

2008年(279)

分类: LINUX

2010-04-16 16:09:53

对每个进程都有一组资源限制,其中一些可以用getrlimit和setrlimit函数查询和更改

getrlimit和setrlimit:资源限制 (getrlimit and setrlimit: Resource Limits)

这两个系统函数是和resource limit相关的。你用过ulimit命令吗?(反正我没用过)
对于每个资源来说有两个limit:一个是hard limit,一个是soft limit,其中后者永远不能超过前者,并且只有拥有superuser权限的进程可以更改前者。
getrlimit和setrlimit的参数相同:第一个参数是资源的类型,第二个参数是rlimit结构的指针,这个结构里面就只有两个成员:hard limit和soft limit
几个重要的资源类型
RLIMIT_CPU:程序执行的最大CPU时间,单位是秒。超过之后程序中止,中止的信号是SIGXCPU
RLIMIT_DATA:程序执行的最大内存
RLIMIT_NPROC:程序孵出的最大子进程数量
RLIMIT_NOFILE:程序打开的文件的最大数量


每一个进程都有自己的一组资源限制,在(*)inux系统中我们可以通过
#include
int getrlimit(int resource, struct rlimit *rlim);
int setrlimit(int resource, const struct rlimit *rlim);
这2个API来取得和设置资源
getrlimit用来取得setrlimit用来设置 这二个参数都需要一个要控制的资源 比如控制CPU、内存、文件描述符个数等等的控制,作为第一个参数传入,第二个参数是一个rlimit的结构体地址(指针),他的结构如下定义:
定义放在头文件/usr/include/bits/resource.h中
struct rlimit
       {
         /* The current (soft) limit.       */
         rlim_t rlim_cur;
         /* The hard limit.       */
         rlim_t rlim_max;
       };
结构体中 rlim_cur是要取得或设置的资源软限制的值,rlim_max是硬限制
这两个值的设置有一个小的约束:
1) 任何进程可以将软限制改为小于或等于硬限制
2) 任何进程都可以将硬限制降低,但普通用户降低了就无法提高,该值必须等于或大于软限制
3) 只有超级用户可以提高硬限制
一个无限的限制由常量RLIM_INFINITY指定(The       value       RLIM_INFINITY       denotes no limit on a resource )


小试牛刀(代码只是演示,并没有作错误处理)
#include
#include
#include
#include
#include
#include
#include
int main(void)
{
     struct rlimit r;
     if(getrlimit(RLIMIT_NOFILE,&r)<0)
     {
         fprintf(stderr,"getrlimit error\n");
         exit(1);
     }
     printf("RLIMIT_NOFILE cur:%d\n",r.rlim_cur);
     printf("RLIMIT_NOFILE max:%d\n",r.rlim_max);

     /** set limit **/
     r.rlim_cur=100;
     r.rlim_max=200;
     if (setrlimit(RLIMIT_NOFILE,&r)<0)
     {
         fprintf(stderr,"setrlimit error\n");
         exit(1);
     }

     /** get value of set **/
     if(getrlimit(RLIMIT_NOFILE,&r)<0)
     {
         fprintf(stderr,"getrlimit error\n");
         exit(1);
     }
     printf("RLIMIT_NOFILE cur:%d\n",r.rlim_cur);
     printf("RLIMIT_NOFILE max:%d\n",r.rlim_max);
     return 0;
}
~
gcc test.c                                                                                                                                                    

./a.out
RLIMIT_NOFILE cur:1024
RLIMIT_NOFILE max:1024
RLIMIT_NOFILE cur:100
RLIMIT_NOFILE max:200
阅读(1858) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~