每个进程都有一组资源限制,其中一些可以用getrlimit和setrlimit函数查询和更改。

  1. #include <sys/resource.h>
  2. int getrlimit( int resource, struct rlimit *rlptr );
  3. int setrlimit( int resource, const struct rlimit *rlptr );
  4. 两个函数返回值:若成功则返回0,若出错则返回非0

进程的资源限制通常是在系统初始化时由进程0建立的,然后由每个后续进程继承。每种实现都可以用自己的方法对各种限制做出调整。

对这两个函数的每一次调用都会指定一个资源以及一个指向下列结构的指针。

  1. struct rlimit {
  2. rlim_t rlim_cur; /* soft limit: current limit */
  3. rlim_t rlim_max; /* hard limit: maximum value for rlim_cur */
  4. };

在更改资源限制时,须遵循下列三条规则:

(1)任何一个进程都可将一个软限制值更改为小于或等于其硬限制值。

(2)任何一个进程都可降低其硬限制值,但它必须大于或等于其软限制值。这种降低对普通用户而言是不可逆的。

(3)只有超级用户进程可以提高硬限制值。

常量RLIM_INFINITY指定了一个无限量的限制。

这两个函数的resource参数取下列值之一:

RLIMIT_AS                进程可用存储区的最大总长度(字节)。这回影响sbrk函数和mmap函数。

RLIMIT_CORE           core文件的最大字节数,若其值为0则阻止创建core文件。

RLIMIT_CPU             CPU时间的最大量值(秒),当超过此软限制时,向该进程发送SIGXCPU信号。

RLIMIT_DATA            数据段的最大字节长度。这是初始化数据、非初始化数据以及堆的总和。

RLIMIT_FSIZE           可以创建的文件的最大字节长度。当超过此软限制时,则向该进程发送SIGXFSZ信号。

RLIMIT_LOCKS          一个进程可持有的文件锁的最大数(此数也包括Linux特有的文件租借数)。

RLIMIT_MEMLOCK     一个进程使用mlock(2)能够锁定在存储器中的最大字节长度。

RLIMIT_NOFILE         每个进程能打开的最大文件数。更改此限制将影响到sysconf函数在参数_SC_OPEN_MAX中的返回值。

RLIMIT_NPROC          每个实际用户ID可拥有的最大子进程数。更改此限制将影响到sysconf函数在参数_SC_CHILD_MAX中返回的值。

RLIMIT_RSS               最大驻内存集的字节长度(resident set size in bytes, RSS)。如果物理存储器供不应求,则内核将从进程处取回超过RSS的部分。

RLIMIT_SBSIZE          用户在任一给定时刻可以占用的套接字缓冲区的最大长度(字节)。(Linux 2.4.22不支持)

RLIMIT_STACK           栈的最大字节长度。

RLIMIT_VMEM           这是RLIMIT_AS的同义词。(Linux 2.4.22不支持)

资源限制影响到调用进程并由其子进程继承。这就意味着为了影响一个用户的所有后续进行,需将资源限制的设置构造在shell之中。Bsh、Bash和Ksh具有内置的ulimit命令,Csh具有内置的limit命令。

程序7-8 打印当前资源限制

  1. [root@localhost apue]# cat prog7-8.c
  2. #include "apue.h"
  3. #if defined(BSD) || defined(MACOS)
  4. #include <sys/time.h>
  5. #define FMT "%10lld "
  6. #else
  7. #define FMT "%10ld "
  8. #endif
  9. #include <sys/resource.h>
  10.  
  11. #define doit(name) pr_limits(#name, name)
  12.  
  13. static void pr_limits(char *, int);
  14.  
  15. int
  16. main(void)
  17. {
  18. #ifdef RLIMIT_AS
  19. doit(RLIMIT_AS);
  20. #endif
  21. doit(RLIMIT_CORE);
  22. doit(RLIMIT_CPU);
  23. doit(RLIMIT_DATA);
  24. doit(RLIMIT_FSIZE);
  25. #ifdef RLIMIT_LOCKS
  26. doit(RLIMIT_LOCKS);
  27. #endif
  28. #ifdef RLIMIT_MEMLOCK
  29. doit(RLIMIT_MEMLOCK);
  30. #endif
  31. doit(RLIMIT_NOFILE);
  32. #ifdef RLIMIT_NPROC
  33. doit(RLIMIT_NPROC);
  34. #endif
  35. #ifdef RLIMIT_RSS
  36. doit(RLIMIT_RSS);
  37. #endif
  38. #ifdef RLIMIT_SBSIZE
  39. doit(RLIMIT_SBSIZE);
  40. #endif
  41. doit(RLIMIT_STACK);
  42. #ifdef RLIMIT_VMEM
  43. doit(RLIMIT_VMEM
  44. #endif
  45. exit(0);
  46. }
  47.  
  48. static void
  49. pr_limits(char *name, int resource)
  50. {
  51. struct rlimit limit;
  52.  
  53. if(getrlimit(resource, &limit) < 0)
  54. err_sys("getrlimit error for %s", name);
  55. printf("%-14s ", name);
  56. if(limit.rlim_cur == RLIM_INFINITY)
  57. printf("(infinite) ");
  58. else
  59. printf(FMT, limit.rlim_cur);
  60. if(limit.rlim_max == RLIM_INFINITY)
  61. printf("(infinite) ");
  62. else
  63. printf(FMT, limit.rlim_max);
  64. putchar((int)'\n');
  65. }

注意,在doit宏中使用了(也只能在宏中使用)ISO C的字符串创建运算符(#),以便为每个资源名产生字符串值。例如:

doit(RLIMIT_CORE);

这将由C预处理器扩展为:

pr_limits(“RLIMIT_CORE”, RLIMIT_CORE);

在Linux下运行此程序,得到:

  1. [root@localhost apue]# ./prog7-8
  2. RLIMIT_AS (infinite) (infinite)
  3. RLIMIT_CORE 0 (infinite)
  4. RLIMIT_CPU (infinite) (infinite)
  5. RLIMIT_DATA (infinite) (infinite)
  6. RLIMIT_FSIZE (infinite) (infinite)
  7. RLIMIT_LOCKS (infinite) (infinite)
  8. RLIMIT_MEMLOCK 32768 32768
  9. RLIMIT_NOFILE 1024 1024
  10. RLIMIT_NPROC 8192 8192
  11. RLIMIT_RSS (infinite) (infinite)
  12. RLIMIT_STACK 10485760 (infinite)

本篇博文内容摘自《UNIX环境高级编程》(第二版),仅作个人学习记录所用。关于本书可参考:http://www.apuebook.com/

进程环境之getrlimit和setrlimit函数的更多相关文章

  1. Linux系统调用--getrlimit()与setrlimit()函数详解

    http://www.cnblogs.com/niocai/archive/2012/04/01/2428128.html 功能描述:获取或设定资源使用限制.每种资源都有相关的软硬限制,软限制是内核强 ...

  2. Linux系统调用--getrlimit()与setrlimit()函数详解【转】

    转自:http://www.cnblogs.com/niocai/archive/2012/04/01/2428128.html 功能描述:获取或设定资源使用限制.每种资源都有相关的软硬限制,软限制是 ...

  3. 进程环境之setjmp和longjmp函数

    在C中,goto语句是不能跨越函数的,而执行这样跳转功能的是函数setjmp和longjmp.这两个函数对于处理发生在深层嵌套函数调用中的出错情况是非常有用的. setjmp和longjmp函数也称为 ...

  4. linux资源限制函数getrlimit,setrlimit(转载)【转】

    转自:http://blog.csdn.net/stormkey/article/details/5890512 版权声明:本文为博主原创文章,未经博主允许不得转载. getrlimit,setrli ...

  5. Linux-进程描述(5)之进程环境

    main函数和启动例程 当内核使用一个exec函数执行C程序时,在调用main函数之前先调用一个特殊的启动例程,可执行程序将此例程指定为程序的起始地址.启动例程从内核获取命令行参数和环境变量,然后为调 ...

  6. 《UNIX环境高级编程》第七章进程环境

    7.2 main函数 1.C程序总是从main函数开始执行的,原型:int main(int argc,char *argv[]);argc是命令行参数的个数argc是指向参数的各个指针所构成的数组2 ...

  7. 《APUE》第7章 进程环境-读书笔记

    一.main函数. main函数的原型如下.argc是命令行参数的数目,argv是指向参数的各个指针所构成的数组. int main(int argc, char *argv[]) 当内核执行C程序时 ...

  8. APUE(7)---进程环境

    一.main函数 C程序总是从main函数开始执行.main函数的原型是: int main(int argv, char *argv[]); 当内核执行C程序时,在调用main前先调用一个特殊的启动 ...

  9. Linux/UNIX之进程环境

    进程环境 进程终止 有8种方式使进程终止,当中5中为正常终止,它们是 1)      从main返回 2)      调用exit 3)      调用_exit或_Exit 4)      最后一个 ...

随机推荐

  1. 【转】OFBiz安全组

    安全组标识 描述 用户系统级别BIZADMIN 全部商业应用程序权限组,具有全部商业应用程序管理权限,不是技术人员权限. bizadmin FLEXADMIN 缓存管理组,具有全部颗粒的权限. fle ...

  2. [irving] C# Windows Beep 调用声音文件

    方法一:Console.Beep(); 方法二:可以用Console.WriteLine("/a");来代替Beep(). MSDN:http://msdn.microsoft.c ...

  3. bzoj4578: [Usaco2016 OPen]Splitting the Field

    2365: Splitting the Field 题意:n个点,求用两个矩形面积覆盖完所有点和一个矩形覆盖完少多少面积 思路:枚举两个矩形的分割线,也就是把所有点分成两个部分,枚举分割点:先预处理每 ...

  4. Ext列表展现--普通排序sortable--全局排序remoteSort(EXTJS 全局排序问题)

    关于Ext的排序问题,一般涉及到两种方式. A.一种是默认的客户端排序机制,对当前页进行排序.sortable 这种排序模式不用多说,是人都会: 1.可以在Ext.grid.ColumnModel列模 ...

  5. 新購電腦筆記 - G1.Sniper B7 內建網路晶片在 Mint 17.2(Cinnamon)上無法使用(已解決)

    又好久沒寫文章了,這次因新購電腦,有一些狀況,故做一下記錄,也分享給遇到同樣問題的格友 以前在公司裝 Ubuntu 從沒遇過這麼多問題,這次自己第一次組電腦,也第一次裝 Mint,問題倒是不少 第一個 ...

  6. Android自定义TTF字体

    前言: 在Android Design中一个设计手册.在设计手册中有常用的UI图标,图标大小规范等. 其中,有一个TTF字体,以前感觉没什么用.但是我在学习时,常看到有许多开发者使用Google 提供 ...

  7. android开发关于popupwindow显示关闭的笔记

    一.方法一: popupWindow.setFocusable(false); //这样popupWindow无法获得焦点,无法处理popupWindow中的事件 设置MainActivity的onT ...

  8. int.class与Integer.type的不同

    int.class返回Integer的对象 Integer.type返回int对象

  9. redis的sets类型

    set是集合 , 它是string类型的无序集合 . set是通过hash table 实现的 , 添加.删除和查找的复杂度都是O(1) . 对集合我们可以取并集.交集.差集.通过这些操作我们可以实现 ...

  10. HYSBZ 2243-染色 (树链剖分)

    1A!!! 哈哈哈哈哈没看题解 没套模板哈哈哈哈 太感动了!! 如果只是线段树的话这道题倒是不难,只要记录左右边界就好了,类似很久以前做的hotel的题 但是树上相邻的段会有连续的 树上top[x]和 ...