每个进程都有一组资源限制,其中一些可以用getrlimit和setrlimit函数获取和修改。
getrlimit
和setrlimit
函数是Unix系统中用于管理系统资源限制的重要工具。通过这两个函数,可以查询和设置当前进程对CPU时间、文件大小、打开文件数等资源的限制,从而更有效地控制进程的行为和避免资源耗尽。
函数定义:
1
2
3
| #include <sys/resource.h>
int getrlimit(int resource, struct rlimit *rlp);
int setrlimit(int resource, const struct rlimit *rlp);
|
参数:
resource
:指定要获取的资源类型。常见的资源类型包括(不限于):
RLIMIT_CORE
:core文件的最大字节数。RLIMIT_CPU
:CPU时间的最大量值(秒)。RLIMIT_DATA
:进程的数据段最大字节长度。RLIMIT_FSIZE
:可以创建的文件的最大字节长度。RLIMIT_NOFILE
:每个进程能打开的最多文件数。RLIMIT_STACK
:栈的最大字节长度。RLIMIT_AS
:进程可用内存最大字节数。RLIMIT_SWAP
:用户可以消耗的交换空间最大数。- …(其他类型)
rlimit
结构体:
1
2
3
4
| struct rlimit {
rlim_t rlim_cur; /* 当前(软)限制 */
rlim_t rlim_max; /* 最大(硬)限制 */
};
|
返回值:成功返回0,失败返回-1。
注意:
- 任何一个进程都可将一个软限制值更改为小于或等于其硬限制值。
- 任何一个进程都可隆低其硬限制值,但它必须大于或等于其软限制值。这种降低,对普通用户而言是不可逆的(除非进程具有超级用户权限)。
- 只有超级用户进程可以提高硬限制值。
实例代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
| #include <stdio.h>
#include <sys/resource.h>
#include <errno.h>
#include <string.h>
int main() {
struct rlimit rl;
// 先获取当前限制
if (getrlimit(RLIMIT_NOFILE, &rl) == -1) {
perror("getrlimit");
return 1;
}
// 假设我们只是想要增加软限制到硬限制的值(这通常不需要root权限)
rl.rlim_cur = rl.rlim_max; // 注意:这里我们假设硬限制足够大以容纳我们想要的软限制
// 设置新的限制
if (setrlimit(RLIMIT_NOFILE, &rl) == -1) {
perror("setrlimit");
return 1;
}
// 再次获取限制以确认更改
if (getrlimit(RLIMIT_NOFILE, &rl) == -1) {
perror("getrlimit");
return 1;
}
printf("New soft limit: %ld\n", rl.rlim_cur);
printf("Hard limit remains: %ld\n", rl.rlim_max);
return 0;
}
|
运行结果:
1
2
3
| $ ./a.out
New soft limit: 1048576
Hard limit remains: 1048576
|