作者:橄榄村 | 来源:互联网 | 2023-05-17 13:35
wait和waitpid函数
当一个进程正常或异常终止时,内核就向其父进程发送一个SIGCHLD信号。因为子进程终止是一个异步事件,所以发生这种信号也是内核向父进程发的异步通知。父进程可以选择忽略该信号,或者提供一个该信号发生时即被调用执行的函数。对于这种信号的系统默认动作是忽略它。现在需要知道的是调用wait或waitpid的进程可能会发生什么情况:
1.如果其所有子进程都还在运行,则阻塞
2.如果一个子进程已终止,正等待父进程获取其终止状态,则取得该子进程的终止状态立即返回。
3.如果它没有任何子进程,则立即出错返回。
#include
#include
pid_t wait(int*status);
pid_twaitpid(pid_t pid, int *status, int options);
如果进程由于接收到SIGCHLD而调用wait,则可期望wait会立即返回。但如果在任意时刻调用wait,则进程可能阻塞。
在一个子进程 终止前,wait使其调用者阻塞,而waitpid有一个选项,可使调用者不阻塞。
这两个函数的参数statloc是一个整形指针。如果statloc不是一个空指针,则终止进程的终止状态就存放在它所指的单元内。如果不关心终止状态,则可将该参数设为空指针。
可用以下宏来检查wait和waitpid所返回的终止状态:
WIFEXITED(status) 若为正常终止子进程返回的状态,则为真。
WEXITSTATUS(status) 若WIFEXITED非零,返回子进程退出码。
WIFSIGNAKED(status) 若为子进程异常终止返回状态(收到一个未捕捉的信号),则为真
WTERMSIG(status) 若WIFSIGNAKED非零,则返回一个信号编号
WIFSTOPPED 若为子进程意外终止,则为真
WSTOPSIG 若WIFSTOPPED非零,返回一个信号编号
waiptpid提供了wait没有提供的三个功能:
1. waitpid可等待一个特定的进程
2. waitpid提供了一个wait的非阻塞版本
3. waitpid支持作业控制