1 wait
1 头文件
<sys/types.h>
<sys/wait.h>
2 调用
pid_t pid = wait(&status);
3 返回值
pid_t: 成功时返回回收的进程pid,设置status,回收进程的状态,可用于判断进程是如何退出的。失败返回-1,并且设置errno。
4 功能作用
- 阻塞等待子进程退出
- 清理子进程残留在内核的 pcb 资源
- 通过传出参数,得到子进程结束状态
5 status值
1 获取子进程正常终止值:
WIFEXITED(status) --> 为真 -->调用 WEXITSTATUS(status) --> 得到 子进程 退出值。
2 获取导致子进程异常终止信号:
WIFSIGNALED(status) --> 为真 -->调用 WTERMSIG(status) --> 得到 导致子进程异常终止的信号编号。
2 waitpid
1 调用
pid_t waitpid(pid_t pid, int* status, int option);
2 参数
1 pid_t pid:
- -1 < : 可指定回收同组的子进程,使用绝对值取值方式对同组的进程进行回收。
- -1 : 回收任意一个子进程
- 0 : 回收和回收者进程相同组的任意同组子进程
- 0 > : 回收指定的任意子进程
2 int* status:返回进程回收的状态,可以通过状态判断进程结束的情况,例如退出方式。
3 int option:
- WNOHANG: 非阻塞方式回收子进程,没有子进程退出,直接返回。
- WUNTRACED: 如果子进程已停止(但未通过ptrace(2)跟踪),也会返回
- WCONTINUED: 如果已通过传递SIGCONT恢复了停止的子项,也会返回。
3 返回值
pid_t: 成功时返回回收的进程pid,设置status,回收进程的状态,可用于判断进程是如何退出的。失败返回-1,并且设置errno。返回0 : 函数调用时, 参3指定了WNOHANG, 并且,没有子进程结束。
3 总结
wait 和 waitpid 都可以对进程进行回收,但是一次只能够回收一个子进程。要回收多个子进程,还需要多次调用进行回收。