一个进程可以通过调用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