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 时表示中断, 所以此时需要继续循环等待), 才表示所有子进程都退出了.
来源: http://www.bubuko.com/infodetail-2969368.html