与setrlimit()函数说明及使用)
1.getrlimit()/setrlimit()函数获取或设置资源使用限制 linux 下每种资源都有相关的软硬限制软限制是内核强加给相应资源的限制值硬限制是软限制的最大值。非授权调用的进程只能将其软限制指定为0~硬限制范围中的某个值同时能不可逆转地降低其硬限制。授权进程可以任意改变其软硬限制。RLIM_INFINITY:表示不对资源限制。用法头文件#include sys/resource.h函数int getrlimit(int resource, struct rlimit *rlim);int setrlimit(int resource, const struct rlimit *rlim);struct rlimit结构体描述软硬限制原型如下struct rlimit {rlim_t rlim_cur;rlim_t rlim_max;};参数说明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。失败返回-1errno被设为以下的某个值EFAULTrlim指针指向的空间不可访问EINVAL参数无效EPERM增加资源限制值时权能不允许2.修改task进程资源上限值ulimit和setrlimit1soft limit是指内核所能支持的资源上限。比如对于RLIMIT_NOFILE(一个进程能打开的最大文件数内核默认是1024)soft limit最大也只能达到1024。对于RLIMIT_CORE(core文件的大小内核不做限制)soft limit最大能是unlimited。2hard limit在资源中只是作为soft limit的上限。当你设置hard limit后你以后设置的soft limit只能小于hard limit。要说明的是hard limit只针对非特权进程也就是进程的有效用户ID(effective user ID)不是0的进程。具有特权级别的进程(具有属性CAP_SYS_RESOURCE)soft limit则只有内核上限。ubuntu 下ulimit指令对比ulimit -c -n -s 软限制ulimit -c -n -s -H 硬限制备注1. unlimited表示no limit, 即内核的最大值2. 当不指定limit的时候该命令显示当前值。这里要注意的是当你要修改limit的时候如果不指定-S或者-H默认是同时设置soft limit和hard limit。也就是之后设置时只能减不能增。所以建议使用ulimit设置limit参数是加上-S。getrlimit和setrlimit注意在使用setrlimit需要检查是否成功来判断新值有没有超过hard limit。如下例Linux系统中在应用程序运行过程中经常会遇到程序突然崩溃提示Segmentation fault这是因为应用程序收到了SIGSEGV信号。这个信号提示当进程发生了无效的存储访问当接收到这个信号时缺省动作是终止w/core。终止w/core的含义是在进程当前目录生成core文件并将进程的 内存 映象复制到core文件中core文件的默认名称就是“core”这是 Unix类系统的一个由来已久的功能。事实上并不是只有SIGSEGV信号产生coredump还有下面一些信号也产生coredumpSIGABRT异常终止、SIGBUS硬件故障、SIGEMT硬件故障、SIGFPE算术异常、SIGILL非法硬件指令、SIGIOT硬件故障SIGQUITSIGSYS无效系统调用SIGTRAP硬件故障等。例子#include sys/resource.hvoid init_core_dump(){struct rlimit limit;memset(limit, 0, sizeof(limit));limit.rlim_cur RLIM_INFINITY; //软限制表示对资源没有限制limit.rlim_max RLIM_INFINITY; //硬限制这个参数表示对资源没有限制一定要大于等于rlim_cur值setrlimit(RLIMIT_CORE, limit);}int main(void){init_core_dump();return 0;}linux下getrlimit()与setrlimit()函数说明及使用-CSDN博客