分类: 系统运维
2012-03-29 13:06:26
每个进程都有一堆资源限制,其中一些可以用getrlimit和setrlimit函数查询和改变。
这两个函数作为SUS的XSI扩展被定义。一个进程的资源限制通常在系统被初始化的时候被进程0建立,然后被每个后继进程继承。每个实现都有它自己调整各种限制的方法。
这两个函数的每次调用都指单个资源和一个指向以下结构体的指针:
struct rlimit {
rlim_t rlim_cur; /* soft limit: current limit */
rlim_t rlim_max; /* hard limit: maximum value for rlim_cur */
};
管理资源限制改变的三个准则:
1、一个进程可以改变它的软限制为一个小于或等于它的硬限制的值;
2、一个进程可以把它的硬限制降低为一个大于或等于它的软限制的值,这个硬限制的降低对普通用户来说是不可逆的。
3、只有超级用户才能提升一个硬限制。
一个无限的限制由常量RLIM_INFINITY指定。
resource参数为以下的某个值。下表展示了哪些限制由SUS定义,和被各实现支持。
资源限制的支持 | |||||
限制 | XSI | FreeBSD 5.2.1 | Linux 2.4.22 | Mac OS X 10.3 | Solaris 9 |
RLIMIT_AS | * | * | * | ||
RLIMIT_CORE | * | * | * | * | * |
RLIMIT_CPU | * | * | * | * | * |
RLIMIT_DATA | * | * | * | * | * |
RLIMIT_FSIZE | * | * | * | * | * |
RLIMIT_LOCKS | * | ||||
RLIMIT_MEMLOCK | * | * | * | ||
RLIMIT_NOFILE | * | * | * | * | * |
RLIMIT_NPROC | * | * | * | ||
RLIMIT_RSS | * | * | * | ||
RLIMIT_SBSIZE | * | ||||
RLIMIT_STACK | * | * | * | * | * |
RLIMIT_VMEM | * | * |
资源限制影响了调用它的进程并由它的子进程继承。这意味着资源限制的设定需要在shell里完成以影响我们所有的将来的进程。确实,在Bourne
shell、GNU Bourne-again shell和Korn shell有内置的ulimit命令,而C
shell有内置的limit命令。(umask和chdir函数同样必须作为shell内置的。)
下面的代码打印了所有在系统上支持的资源限制的软限制和硬限制。为了在所有不同的实现上编译这个程序,我们必须选择性的包含不同的资源名。注意我们在把
rlim_t定义为一个unsigned long long而不是unsigned long的平台上必须使用一个不同的printf格式。
注意我们使用了ISO C的字符创建操作符(#)在doit宏里,来产生每个资源名的字符串值。当我们说doit(RLIMIT_CORE);时,C预处理器把它展开为pr_limits("RLIMIT_CORE", RLIMIT_CORE);
程序输出(Linux 2.6.38-13-generic):
RLIMIT_AS (infinite) (infinite)
RLIMIT_CORE 0 (infinite)
RLIMIT_CPU (infinite) (infinite)
RLIMIT_DATA (infinite) (infinite)
RLIMIT_FSIZE (infinite) (infinite)
RLIMIT_LOCKS (infinite) (infinite)
RLIMIT_MEMLOCK 65536 65536
RLIMIT_NOFILE 1024 4096
RLIMIT_NPROC (infinite) (infinite)
RLIMIT_RSS (infinite) (infinite)
RLIMIT_STACK 8388608 (infinite)