一、进程资源查询于更改函数
#include <sys/resource.h>
int getrlimit(int resource, struct rlimit *rlptr);
int setrlimit(int resource, const struct rlimit *rlptr);
//返回值:两个函数返回:若成功则为 0,若出错则为非0
- 备注:
- 进程的资源限制通常是在系统初始化时由0进程建立的,然后由后续进程继承。每种实现都可以用自己的方法对资源限制做出调整
- 资源限制影响到调用进程并由其子进程继承。这就意味着为了影响一个用户的所有后续进 程,需将资源限制设置构造在shell之中。确实,Bourne shell和Korn shell具有内部ulimit命令, C shell具有内部limit命令。( umask和chdir函数也必须是shell内部的)
更改资源的限制
- ①任何一个进程都可将一个软限制更改为小于或等于其硬限制。
- ②任何一个进程都可降低其硬限制值,但它必须大于或等于其软限制值。这种降低,对普通用户而言是不可逆反的(只能增加,增加之后不可以降低)
- ③只有超级用户可以提高硬限制
- 一个无限量的限制由常数RLIM_INFINITY指定
二、参数
- 参数1:资源的类型
参数2:一个指向下列结构体的指针
struct rlimit { rlim_t rlim_cur; /* soft limit: current limit */ rlim_t rlim_max; /* hard limit: maximum value for rlim_cur */ };
- rlim_cur //软限制值(当前限制值)
- rlim_max //硬限制值(最大限制值)
三、案例
注意一:
- 有些平台定义rlim_t为unsigned long long而非unsigned long。
- 在同一系统中这个定义可能也会变动,这取决于我们在编译程序时候是否支持64位文件。有限制止作用于文件大小,因此rlim_t类型必须足够大才能表示文件大小限制。
- 为了避免使用错误的格式说明而导致编译器警告,通常会首先把限制复制到64位整型,这样只需处理一种格式
注意二:
- 在doit宏中使用了新的ANSI C字符串创建算符( # ),以便为每个资源名产生字符串值
- 例如:doit(RLIMIT_CORE) ; 这将由C预处理程序扩展为: pr_limits("RLIMIT_CORE", RLIMIT_CORE);
//打印由系统支持的所有的资源当前的软限制和硬限制
#include <sys/resource.h>
#define doit(name) pr_limits(#name, name)
static void pr_limits(char *, int);
int main(void)
{
#ifdef RLIMIT_AS
doit(RLIMIT_AS);
#endif
doit(RLIMIT_CORE);
doit(RLIMIT_CPU);
doit(RLIMIT_DATA);
doit(RLIMIT_FSIZE);
#ifdef RLIMIT_MEMLOCK
doit(RLIMIT_MEMLOCK);
#endif
#ifdef RLIMIT_MSGQUEUE
doit(RLIMIT_MSGQUEUE);
#endif
#ifdef RLIMIT_NICE
doit(RLIMIT_NICE);
#endif
doit(RLIMIT_NOFILE);
#ifdef RLIMIT_NPROC
doit(RLIMIT_NPROC);
#endif
#ifdef RLIMIT_NPTS
doit(RLIMIT_NPTS);
#endif
#ifdef RLIMIT_RSS
doit(RLIMIT_RSS);
#endif
#ifdef RLIMIT_SBSIZE
doit(RLIMIT_SBSIZE);
#endif
#ifdef RLIMIT_SIGPENDING
doit(RLIMIT_SIGPENDING);
#endif
doit(RLIMIT_STACK);
#ifdef RLIMIT_SWAP
doit(RLIMIT_SWAP);
#endif
#ifdef RLIMIT_VMEM
doit(RLIMIT_VMEM);
#endif
exit(0);
}
static void pr_limits(char *name, int resource)
{
struct rlimit limit;
unsigned long long lim;
if (getrlimit(resource, &limit) < 0)
printf("getrlimit error for %s", name);
printf("%-14s ", name);
if (limit.rlim_cur == RLIM_INFINITY) {
printf("(infinite) ");
}
else {
lim = limit.rlim_cur;
printf("%10lld ", lim);
}
if (limit.rlim_max == RLIM_INFINITY) {
printf("(infinite)");
}
else {
lim = limit.rlim_max;
printf("%10lld", lim);
}
putchar((int)'\n');
}