1.wait函数的作用
多进程程序中,父进程需要跟踪子进程的退出状态。因此当子进程退出时,内核不会立刻释放该进程的进程表项,而是需要父进程读取一下子进程的状态,子进程才能终止。
因此子进程运行结束之后,父进程读取其退出状态之前,称该进程处于僵尸态。另外一种是父进程终止或者异常退出,子进程继续执行(此时子进程的PPID被操作系统设置为1,即init进程接管了该子进程并等待它结束),则在子进程退出之前,该子进程处于僵尸态。
因此只要是父进程没有读取子进程的返回信息,子进程就会停在僵尸态。
所以wait、waitpid函数就是用来读取子进程的返回信息,使子进程完全终止。
2.wait、waitpid函数的使用方法
pid_t wait(int *status); //wait函数会在父进程中阻塞,等待子进程结束,如果子进程结束,则返回子进程的PID。如果没有子进程则立刻返回-1。
pid_t waitpid(pid_t pid, int *status, int options); //waitpid函数等待子进程结束(options设置为WNOHANG时为非阻塞),如果子进程结束,则返回子进程的PID。如果没有子进程则立刻返回-1,如果是非阻塞的并且子进程还没有结束,则返回0。
由于这两个函数会阻塞等待(非阻塞时也需要轮询执行),所以常规使用方式为:当子进程退出时会给父进程发送SIGCHID信号,因此父进程捕获SIGCHID信号,并在信号处理函数中调用waitpid函数来结束一个子进程。如下:
3.问题
问题1:如果有多个子进程,则任意一个子进程结束时,wait函数就会返回,所以此时可以循环判断wait返回-1时(另外返回-1时,errno 等于EINTR时表示中断,所以此时需要继续循环等待),才表示所有子进程都退出了。
原文:https://www.cnblogs.com/iamwho/p/10441700.html