Linux(编程-进程基础):06:---进程资源函数(getrlimit、setrlimit)

一、进程资源查询于更改函数

#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');
}

猜你喜欢

转载自blog.csdn.net/qq_41453285/article/details/88967040