您的位置:首页 > 大数据 > 人工智能

8.6 进程控制_wait和waitpid

2010-05-18 15:15 417 查看
当一个进程正常或异常终止时,内核就向其父进程发送SIGCHLD信号。因为子进程终止是个异步事件,所以这种信号也是内核向父进程发的异步通知。

调用wait或waitpid的进程可能会发生什么情况:

如果其所有子进程都还在运行,则阻塞。

如果一个子进程已终止,正等待父进程获取其终止状态,则取得该子进程的终止状态立即返回。

如果它没有任何子进程,则立即出错返回。

如果进程由于接收到SIGCHLD信号而调用wait,则可期望wait会立即返回。但是如果在任意时刻调用wait,则进程可能会阻塞。

#include <sys/wait.h>

pid_t wait(int *statloc);

pid_t waitpid(pid_t pid, int *statloc, int options);

两个函数返回值:若成功则返回进程ID,0,若出错则返回-1
两个函数的区别如下:

在一个子进程终止前,wait使其调用者阻塞,而waitpid有一个选项,可使调用者不阻塞。

waitpid并不等待在其调用之后的第一个终止子进程,它有若干个选项,可以控制它所等待的进程。

如果一个进程已经终止,并且是一个僵死进程,则wait立即返回并取得该子进程的状态,否则wait使其调用者阻塞直到一个子进程终止。wait返回终止子进程的进程ID。

这两个函数的参数statloc是一个整型指针。如果statloc不是一个空指针,则终止进程的终止状态就存放在它所指向的单元内。如果不关心终止状态,则可将该参数指定为空指针。

依据传统,这两个函数返回的整型状态字是由实现定义的。其中某些位表示退出状态(正常返回),其他位则指示信号编号(异常返回),有一位指示是否产生一个core文件等。

对于waitpid函数中pid参数的作用解释如下:

pid ==-1 等待任一子进程。就这一方面言,waitpid与wait等效。

pid > 0 等待其进程ID与pid相等的子进程。

pid == 0 等待其组ID等于调用进程组ID的任一子进程。

pid < -1 等待其组ID等于pid绝对值的任一子进程。

waitpid函数返回终止子进程的进程ID,并将该子进程的终止状态存放在由statloc指向的存储单元中。对于wait,其唯一的出错是调用进程没有子进程(函数调用被一个信号中断时,也可能返回另一种出错)。但是对于waitpid,如果指定的进程或进程组不存在,或者参数pid指定的进程不是调用进程的子进程则都将出错。

options参数使我们能进一步控制waitpid的操作。

Constant

Description

WCONTINUED

If the implementation supports job control, the status of any child specified by pid
that has been continued after being stopped, but whose status has not
yet been reported, is returned (XSI extension to POSIX.1).
WNOHANG

The waitpid
function will not block if a child specified by pid
is not immediately available. In this case, the return value is 0.
WUNTRACED

If the implementation supports job control, the status of any child specified by pid
that has stopped, and whose status has not been reported since it has stopped, is returned. The WIFSTOPPED
macro determines whether the return value corresponds to a stopped child process.
图8.1 waitpid的options常量

waitpid函数提供了wait函数没有提供的三个功能:

waitpid可等待一个特定的进程,而wait则返回任一终止子进程的状态。在讨论popen函数时在说明这一功能。

waitpid提供了一个wait的非阻塞版本。

waitpid支持作业控制。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: