美文网首页
linux中getrlimit和setrlimit系统调用用法

linux中getrlimit和setrlimit系统调用用法

作者: 明明就_c565 | 来源:发表于2018-11-20 12:07 被阅读0次

功能描述

getrlimit获取或设定资源使用限制,setrlimit设置资源使用限制

每种资源都有相关的软硬限制,软限制是内核强加给相应资源的限制值,硬限制是软限制的最大值。非授权调用进程只可以将其软限制指定为0~硬限制范围中的某个值,同时能不可逆转地降低其硬限制。授权进程可以任意改变其软硬限制。

RLIM_INFINITY的值表示不对资源限制。

使用

头文件

#include <sys/resource.h>

函数原型

int getrlimit(int resource, struct rlimit *rlim);

int setrlimit(int resource, const struct rlimit *rlim);

参数:

rlim:描述资源软硬限制的结构体,原型如下

struct rlimit {

rlim_t rlim_cur;      //soft limit

rlim_t rlim_max;    //hard limit

};

soft limit是指内核所能支持的资源上限。比如对于RLIMIT_NOFILE(一个进程能打开的最大文件数,内核默认是1024),soft limit最大也只能达到1024。对于RLIMIT_CORE(core文件的大小,内核不做限制),soft limit最大能是unlimited。

hard limit在资源中只是作为soft limit的上限。当你设置hard limit后,你以后设置的soft limit只能小于hard limit。要说明的是,hard limit只针对非特权进程,也就是进程的有效用户ID(effective user ID)不是0的进程。具有特权级别的进程(具有属性CAP_SYS_RESOURCE),soft limit则只有内核上限。

resource:可能的选择有

RLIMIT_AS //进程的最大虚内存空间,字节为单位。

RLIMIT_CORE //内核转存文件的最大长度。

RLIMIT_CPU //最大允许的CPU使用时间,秒为单位。当进程达到软限制,内核将给其发送SIGXCPU信号,这一信号的默认行为是终止进程的执行。然而,可以捕捉信号,处理句柄可将控制返回给主程序。如果进程继续耗费CPU时间,核心会以每秒一次的频率给其发送SIGXCPU信号,直到达到硬限制,那时将给进程发送 SIGKILL信号终止其执行。

RLIMIT_DATA //进程数据段的最大值。

RLIMIT_FSIZE //进程可建立的文件的最大长度。如果进程试图超出这一限制时,核心会给其发送SIGXFSZ信号,默认情况下将终止进程的执行。

RLIMIT_LOCKS //进程可建立的锁和租赁的最大值。

RLIMIT_MEMLOCK //进程可锁定在内存中的最大数据量,字节为单位。

RLIMIT_MSGQUEUE //进程可为POSIX消息队列分配的最大字节数。

RLIMIT_NICE //进程可通过setpriority() 或 nice()调用设置的最大完美值。

RLIMIT_NOFILE //指定比进程可打开的最大文件描述词大一的值,超出此值,将会产生EMFILE错误。

RLIMIT_NPROC //用户可拥有的最大进程数。

RLIMIT_RTPRIO //进程可通过sched_setscheduler 和 sched_setparam设置的最大实时优先级。

RLIMIT_SIGPENDING //用户可拥有的最大挂起信号数。

RLIMIT_STACK //最大的进程堆栈,以字节为单位。

返回值

成功执行时,返回0。失败返回-1,errno被设为以下的某个值

EFAULT:rlim指针指向的空间不可访问

EINVAL:参数无效

EPERM:增加资源限制值时,权能不允许

常用设置举例

比如设置core file

struct rlimit rlim_new,rlim;

if (getrlimit(RLIMIT_CORE, &rlim)==0) {

rlim_new.rlim_cur = rlim_new.rlim_max = RLIM_INFINITY;

if (setrlimit(RLIMIT_CORE, &rlim_new)!=0) {

rlim_new.rlim_cur = rlim_new.rlim_max = rlim.rlim_max;

(void) setrlimit(RLIMIT_CORE, &rlim_new);

}

}

设置file_max

#include <stdio.h>

#include <sys/resource.h>

int main()

{

        rlimit r1,r2;

        rlimit tmp={4095,4096};

        getrlimit(RLIMIT_NOFILE,&r1);

        printf("rlim_cur=%d,rlim_max=%d\n",r1.rlim_cur,r1.rlim_max);

        setrlimit(RLIMIT_NOFILE,&tmp);

        getrlimit(RLIMIT_NOFILE,&r2);

        printf("rlim_cur=%d,rlim_max=%d\n",r2.rlim_cur,r2.rlim_max);

        return 0;

}

测试结果

[root@localhost test]# ./a.out

rlim_cur=1024,rlim_max=4096

rlim_cur=4095,rlim_max=4096

相关文章

  • linux中getrlimit和setrlimit系统调用用法

    功能描述 getrlimit获取或设定资源使用限制,setrlimit设置资源使用限制 每种资源都有相关的软硬限制...

  • Linux系统调用--getrlimit()与setrlimit

    功能描述: 获取或设定资源使用限制。每种资源都有相关的软硬限制,软限制是内核强加给相应资源的限制值,硬限制是软限制...

  • 使用系统调用方式实现文件拷贝

    1.1实验目的 n掌握Linux系统调用对文件操作 n掌握linux系统调用的常用函数文件访问用法 1.2实验内容...

  • Linux 中的errno和perror

    Linux 中的errno和perror Linux中系统调用的错误都存储于errno中, errno由操作系统维...

  • 操作系统(linux0.11)的系统调用

    什么是系统调用 Linux内核中设置了一组用于实现各种系统功能的子程序,称为系统调用.系统调用和普通库函数调用非常...

  • 系统调用号

    linux系统调用号,32位 linux系统调用号,64位 macos系统调用

  • Operating System代写:CS162 User Pr

    代写完成三个子任务,练习Linux操作系统编程。了解进程相关系统调用以及文件相关系统调用的用法。Your task...

  • Linux系统简介

    Linux 是一个操作系统,在整个计算机系统中,linux也就是系统调用和内核那两层。 Linux 与Window...

  • 2018-11-04网络攻防第四周学习文档

    Linux 主要了解了一下linux的内存管理的基本概念,系统调用,和其I/O系统的系统调用以及实现,另外就是文件...

  • Linux常用命令

    Linux中wc命令用法 Linux系统中的wc(Word Count)命令的功能为统计指定文件中的字节数、字数、...

网友评论

      本文标题:linux中getrlimit和setrlimit系统调用用法

      本文链接:https://www.haomeiwen.com/subject/scvtqqtx.html