博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux getrlimit和setrlimit函数
阅读量:7080 次
发布时间:2019-06-28

本文共 2201 字,大约阅读时间需要 7 分钟。

  hot3.png

表头文件:#include <sys/resource.h>

定义函数:

int getrlimit(int resource, struct rlimit *rlim);int setrlimit(int resource, const struct rlimit *rlim);(1) 第一个参数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 //最大的进程堆栈,以字节为单位。会被截断(2) 第二个参数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则只有内核上限。

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

错误代码:

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

            EINVAL:参数无效
            EPERM:增加资源限制值时,权限不允许

注意:

        当使用setrlimit时,需要检查是否成功来判断新值有没有超过hard limit。如下例Linux系统中在应用程序运行过程中经常会遇到程序突然崩溃,提示:Segmentation fault,这是因为应用程序收到了SIGSEGV信号。这个信号提示当进程发生了无效的存储访问,当接收到这个信号时,缺省动作是:终止w/core。终止w/core的含义是:在进程当前目录生成core文件,并将进程的内存映象复制到core文件中,core文件的默认名称就是“core”(这是 Unix类系统的一个由来已久的功能)。事实上,并不是只有SIGSEGV信号产生coredump,还有下面一些信号也产生coredump:SIGABRT(异常终止)、SIGBUS(硬件故障)、SIGEMT(硬件故障)、SIGFPE(算术异常)、SIGILL(非法硬件指令)、SIGIOT(硬件故障),SIGQUIT,SIGSYS(无效系统调用),SIGTRAP(硬件故障)等。

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

 

转载于:https://my.oschina.net/shou1156226/blog/779580

你可能感兴趣的文章
MSDN中关于COM教程编译参数的修改
查看>>
leetcode725
查看>>
LLVM3.8停止了旧Windows版本,取消Autoconf,改进Clang
查看>>
《快学 Go 语言》第 9 课 —— 接口
查看>>
Swift 中的利刃,函数和闭包
查看>>
HOWTO: 为GitHub for Windows指定代理服务器(转)
查看>>
联通混改再现反转:中车集团确认参与
查看>>
用C/C++开发基于VLC SDK的视频播放器
查看>>
grpc vs2015编译
查看>>
注解的使用
查看>>
X264 ratecontrol 码率控制
查看>>
iOS中 UISearchController 搜索栏 UI技术分享
查看>>
新手神器!不用部署深度学习环境、上传数据集!(附代码&视频教程)
查看>>
使用Python+OpenCV进行图像模板匹配(Match Template)
查看>>
Assembly Loop
查看>>
Windows注册密码能保护你的数据安全吗?
查看>>
新工具填补Docker管理空白
查看>>
行为驱动开发使用体验
查看>>
智慧城市:中国特色新型城镇化的发展方向
查看>>
新恶意软件使用Tor在Mac OS X系统打开“后门”
查看>>