linux wait 子孙进程,Linux系统编程手册:进程资源

66b52468c121889b900d4956032f1009.png

8种机械键盘轴体对比

本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?

getrusage系统调用返回调用进程或其子进程用掉的各类系统资源的统计信息。

#include

int getrusage(int who, struct rusage *res_usage);

/* 成功返回0,失败返回-1 */

struct rusage {

struct timeval ru_utime; /* User CPU time used */

struct timeval ru_stime; /* System CPU time used */

long ru_maxrss; /* Maximum size of resident set (kb) */

long ru_ixrss; /* unused */

/* ... */

};

who参数指定了需查询资源使用信息的进程,取值为下列几个值的一个:

RUSAGE_SELF

返回调用进程相关的信息。

RUSAGE_CHILDREN

返回调用进程的所有被终止和处于等待状态的子进程相关的信息。

RUSAGE_THREAD

返回调用线程的相关信息(Linux2.6.26起,Linux特有)。

在Linux上,调用getrusage/wait3/wait4时,rusage结构中的很多字段都不会被填充,只有最新的内核才会填充这些字段。

getrusage的RUSAGE_CHILDREN操作返回的rusage结构中包含了调用进程的子孙进程的资源使用统计信息。wait子进程时,子进程的资源使用信息会被加到父进程的RUSAGE_CHILDREN上;如果没有wait,则不会加。

进程资源限制

每个进程都有一组资源限制值,他们可以用来限制进程能够消耗的各种系统资源。使用shell的内置命令ulimit可以设置shell的资源限制(在C shell中是limit)。shell创建用来执行用户命令的进程会继承这些限制。

getrlimit和setrlimit系统调用允许一个进程读取和改变自己的资源限制。

#include

int getrlimit(int resource, struct rlimit *rlim);

int setrlimit(int resource, const struct rlimit *rlim);

/* 成功返回0,失败返回-1 */

struct rlimit {

rlim_t rlim_cur; /* Soft limit */

rlim_r rlim_max; /* Hard limit */

};

resource参数标识出了需读取或修改的资源限制。

软限制规定了进程能够消耗的资源数量。一个进程可以将软限制调整为从0到硬限制之间的值。对于大多数资源来讲,硬限制的唯一作用是为软限制设定了上限。特权(CAP_SYS_RESOURCE)进程能够增大和缩小硬限制(只要其值大于软限制),非特权进程只能缩小硬限制。在rlim_cur/rlim_max取值为RLIM_INFINITY表示没有限制。

特定资源限制细节

RLIMIT_AS

RLIMIT_AS限制规定了进程的虚拟内存(地址空间)的最大字节数,试图(brk、sbrk、mmap、mremap以及shmat)超出这个限制会得到ENOMEM错误。

在实践中,程序中会超出这个限制的最常见的地方是在调用malloc包中的函数时,因为他们会使用sbrk和mmap。当碰到这个限制时,栈增长操作也会失败,进而会出现下面RLIMIT_SRACK限制中列出的情况。

RLIMIT_CORE

RLIMIT_CORE限制规定了当进程被特定信号终止时产生的dump文件的最大字节数。当达到这个限制时,核心dump文件就不会再产生了。将这个限制指定为0会阻止核心dump文件的创建。核心dump文件可能会变得非常大,而最终用户又无法处理。另一个禁用的目的是安全性,防止程序占用的内存中的内容输出到磁盘上。

如果RLIMIT_FSIZE限制低于这个值,那么核心dump文件的最大大小会被限制为RLIMIT_FSIZE字节。

RLIMIT_CPU

RLIMIT_CPU限制规定了进程最多使用的CPU时间(包括用户模式和内核模式)。SUSv3要求当达到软限制时需要向进程发送一个SIGXCPU信号。在达到软限制之后,内核(Linux)会在进程每消耗一秒钟的CPU时间后向其发送一个SIGXCPU信号。当进程继续执行到硬CPU限制时,内核会向进程发送一个SIGKILL信号,该信号总是会终止进程。

RLIMIT_DATA

RLIMIT_DATA限制规定了进程的数据段的最大字节数(初始化数据段,BSS段,堆段的总和)。

RLIMIT_FSIZE

RLIMIT_FSIZE限制规定了进程能够创建的文件的最大字节数。如果试图扩充一个文件使其超过这个软限制值,那么内核就会向其发送一个SIGXFSZ信号,并且系统调用(write、truncate)会返回EFBIG错误。

总结

进程会消耗各种资源,getrusage系统调用允许一个进程监控自己及其子进程所消耗的各种资源。

setrlimit和getrlimit系统调用允许一个进程设置和获取自己在各种资源上的消耗限制。每个资源限制有两个组成部分:一个是软限制,内核在检查进程的资源消耗时会应用这个限制;另外一个是硬限制,它是软限制可取的最大值。非特权进程可以将一个资源的软限制设置为0到硬限制之间的任意一个值,但只能降低硬限制值。特权进程能够随意修改这两个限制值,只要软限制小于等于硬限制值即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值