回收子进程(wait/waitpid)
子进程终止后不会立即消亡,需要父进程调用 wait 或 waitpid 来”回收”其残留信息。
基础行为:waitpid(pid, &status, options) 等待指定子进程终止,并获取其退出状态。wait(&status) 是 waitpid(-1, &status, 0) 的简化版本,等待任意一个子进程。
退出状态:子进程终止时,其退出状态(exit code)或终止信号编号保存在内核的进程控制块中。父进程通过 wait 获取的状态值可以使用 WIFEXITED、WEXITSTATUS、WIFSIGNALED 等宏进行解析。
选项参数:
- WNOHANG:非阻塞模式。如果子进程仍在运行,不阻塞立即返回 0。适用于父进程需要同时处理多项任务的场景(如服务器轮询子进程状态)。
- WUNTRACED:捕获子进程暂停事件(如收到
SIGSTOP或SIGTSTP)。主要用于调试器实现(如 GDB 断点)。 - WCONTINUED:捕获子进程恢复运行事件(收到
SIGCONT)。用于追踪进程完整生命周期。
回收时机:父进程应在子进程终止后尽快调用 wait 回收。如果父进程不回收,子进程将变成僵尸进程。如果父进程先终止,子进程被 init 进程(PID=1)收养并自动回收。
链接到
- 上一个知识点:8.9 fork创建进程
- 下一个知识点:8.11 僵尸进程与孤儿进程