#include<sys/types.h>
#include<sys/wait.h>
pid_t wait(int *statloc)
pid_t waitpid(pid_t pid,int *statloc,int options)
功能:
功能:当子进程终止时返回,主要用来处理已终止的子进程。当子进程处理完任务后,处于僵死状态,也就成为了僵死进程,父类可以通过上面两个函数捕获到,从而处理掉僵死进程,归还内存、CPU等资源。
提问:如果父进程没有处理,放任僵死进程横行,最后父进程消亡了怎么办?
答: 父进程消亡了,子进程就变成了孤儿进程,将孤儿进程的父进程id设置为1,也就是init进程,最后由init进程处理这些僵死的孤儿进程。
pid_t wait(int *statloc)
有两个返回参数,直接返回的pid_t 是已经返回的子进程ID(如果错误返回0或者-1),statloc子进程终止状态,可由终止状态知道子进程的死因(正常死亡、由信号杀死、任务作业控制停止)。
wait 是阻塞的,如果调用wait的进程没有子进程终止,不过有一个或者多个子进程在运行,那么wait将阻塞到第一个子进程终止为止。
pid_t waitpid(pid_t pid,int *statloc,int options)
WUNTRACED 如果子进程进入暂停执行情况则马上返回,但结束状态不予以理会。
子进程的结束状态返回后存于 status,底下有几个宏可判别结束情况:
WIFEXITED(status)如果子进程正常结束则为非 0 值。
WEXITSTATUS(status)取得子进程 exit()返回的结束代码,一般会先用
WIFEXITED 来判断是否正常结束才能使用此宏。
WIFSIGNALED(status)如果子进程是因为信号而结束则此宏值为真
WTERMSIG(status) 取得子进程因信号而中止的信号代码,一般会先用 WIFSIGNALED 来判断后才使用此宏。
WIFSTOPPED(status) 如果子进程处于暂停执行情况则此宏值为真。一般只有使用 WUNTRACED 时才会有此情况。
WSTOPSIG(status) 取得引发子进程暂停的信号代码,一般会先用 WIFSTOPPED 来判断后才使用此宏。