一 进程资源
1. 资源列表
UNIX/Linux 操作系统族 对进程资源进行了抽象;下图为部分操作系统版本支持的资源类型
2 资源配置
以下接口可以用来查询或者配置系统资源限制
兼容标准:POSIX.1-2001, POSIX.1-2008, SVr4, 4.3BSD.
#include <sys/time.h>
#include <sys/resource.h>
int getrlimit(int resource, struct rlimit *rlim);
int setrlimit(int resource, const struct rlimit *rlim);
3 系统实验
#include <iostream>
using namespace std;
/*c接口,只好extern C*/
extern "C"
{
#include <sys/time.h>
#include <sys/resource.h>
}
/*这里用到一种字符串创建技巧*/
#define pr_rlimit(name) print_rlimit(#name,name)
//int getrlimit(int resource, struct rlimit *rlim);
//int setrlimit(int resource, const struct rlimit *rlim);
int print_rlimit(char const *str, int resource);
int main(void)
{
/*虚拟地址空间上限:笔者系统显示,无上限*/
pr_rlimit(RLIMIT_AS);
/*Core 文件size上限:无上限*/
pr_rlimit(RLIMIT_CORE);
/*CPU时间/秒单位上限:无上限*/
pr_rlimit(RLIMIT_CPU);
/*数据段(静态区,堆):无上限*/
pr_rlimit(RLIMIT_DATA);
/*进程创建文件可能的最大size:无上限*/
pr_rlimit(RLIMIT_FSIZE);
/*用途不详?*/
pr_rlimit(RLIMIT_MEMLOCK);
/*see mq_open?*/
pr_rlimit(RLIMIT_MSGQUEUE);
/*进程优先级最高级:0级*/
pr_rlimit(RLIMIT_NICE);
/*可以打开的文件最大个数:1024个*/
pr_rlimit(RLIMIT_NOFILE);
/*可以创建的最大子进程个数:7758*/
pr_rlimit(RLIMIT_NPROC);
/*?*/
pr_rlimit(RLIMIT_RSS);
/*?*/
pr_rlimit(RLIMIT_RTPRIO);
/*?*/
pr_rlimit(RLIMIT_RTTIME);
/*pending 信号的最大值:7758*/
pr_rlimit(RLIMIT_SIGPENDING);
/*进程最大栈容量字节:8388608*/
pr_rlimit(RLIMIT_STACK);
cout << "Infinite val is : " << RLIM_INFINITY << endl;
return 0;
}
int print_rlimit(char const *str, int resource)
{
int res = 0;
if(NULL == str)
{
res = -1;
goto End;
}
struct rlimit limit;
if(res = getrlimit(resource,&limit))
goto End;
cout << str << ": Max = " << limit.rlim_max << " Cur = " <<
limit.rlim_cur << endl;
End:
return res;
}
输出:
RLIMIT_AS: Max = 18446744073709551615 Cur = 18446744073709551615
RLIMIT_CORE: Max = 18446744073709551615 Cur = 0
RLIMIT_CPU: Max = 18446744073709551615 Cur = 18446744073709551615
RLIMIT_DATA: Max = 18446744073709551615 Cur = 18446744073709551615
RLIMIT_FSIZE: Max = 18446744073709551615 Cur = 18446744073709551615
RLIMIT_MEMLOCK: Max = 65536 Cur = 65536
RLIMIT_MSGQUEUE: Max = 819200 Cur = 819200
RLIMIT_NICE: Max = 0 Cur = 0
RLIMIT_NOFILE: Max = 1048576 Cur = 1024
RLIMIT_NPROC: Max = 7758 Cur = 7758
RLIMIT_RSS: Max = 18446744073709551615 Cur = 18446744073709551615
RLIMIT_RTPRIO: Max = 0 Cur = 0
RLIMIT_RTTIME: Max = 18446744073709551615 Cur = 18446744073709551615
RLIMIT_SIGPENDING: Max = 7758 Cur = 7758
RLIMIT_STACK: Max = 18446744073709551615 Cur = 8388608
Infinite val is : 18446744073709551615
二 更改进程资源
int setrlimit(int resource, const struct rlimit *rlim);
struct rlimit {
rlim_t rlim_cur; /* Soft limit */
rlim_t rlim_max; /* Hard limit (ceiling for rlim_cur) */
};
前置条件:
- 只有超级用户才能修改进程rlim_max 字段
- 进程 owner可以降级rlim_cur或者rlim_max ,但要求 rlim_cur <= rlim_max