对每个进程都有一组资源限制,其中一些可以用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
阅读(1890) | 评论(0) | 转发(0) |