一个进程可以通过调用waitpid函数来等待它的子进程终止或者停止。

——————————————————————————————

#include <sys/types.h>

#include <sys/wait.h>

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

返回:如果成功,则为子进程的PID,如果WNOHANG,则为0,如果其他错误,则为-1

——————————————————————————————

1.判定等待集合的成员

等待集合的成员是由参数pid来确定的:

如果pid>0,那么等待集合就是一个单独的子进程,它的进程ID等于pid。

如果pid=-1,那么等待集合就是由父进程所有的子进程组成的。

2.修改默认行为

可以通过将option设置为常量WNOHANG和WUNTRACED的各种组合,修改默认行为:

WNOHANG:

如果等待集合中的任何子进程都还没有终止。那么就立刻返回(返回值为0)。

默认的行为是挂起调用进程,直到有子进程终止。在等待子进程终止的同时,

如果还想做些有用的工作,这个选项会有用

WUNTRACED:

挂起调用进程的执行,直到等待集合中的一个进程已终止或者被停止。返回的PID为导致返回的已终止或被停职子进程的PID.默认的行为是只返回已终止的子进程。当你想要检查已终止和被停止的子进程时,这个选项会有用。

3.检查已回收子进程的退出状态

如果status参数是非空的,那么waitpid就会在status参数中放上关于导致返回的子进程的状态信息。

wait.h头文件定义了解释status参数的几个宏

WIFEXITED:

如果子进程通过调用exit或者一个返回(return)正常终止,就返回真

WEXITSTATUS:

返回一个正常终止的子进程的退出状态。只有在WIFEXITED返回为真是,才会定义这个在状态

WIFSIGNALED:

如果子进程是因为一个为捕获的信号终止的,那么就返回真

WTERMSIG:

返回导致子进程终止的信号的数量。只有在WIFSIGNALED返回为真时,才定义这个状态。

WIFSTOPPED:

如果引起返回的子进程当前是被停止的,那么就返回真。

WSTOPSIG:

返回引起子进程停止的信号的数量。只有在WIFSTOPPED返回为真时,才定义这个状态。

4.错误条件

如果调用进程没有子进程,那么waitpid返回-1,并且设置errno为ECHILD。如果waitpid函数被一个信号中断,那么它返回-1,并设置errno为EINTR