回收子进程(wait/waitpid)

子进程终止后不会立即消亡,需要父进程调用 waitwaitpid 来”回收”其残留信息。

基础行为waitpid(pid, &status, options) 等待指定子进程终止,并获取其退出状态。wait(&status)waitpid(-1, &status, 0) 的简化版本,等待任意一个子进程。

退出状态:子进程终止时,其退出状态(exit code)或终止信号编号保存在内核的进程控制块中。父进程通过 wait 获取的状态值可以使用 WIFEXITEDWEXITSTATUSWIFSIGNALED 等宏进行解析。

选项参数

  • WNOHANG:非阻塞模式。如果子进程仍在运行,不阻塞立即返回 0。适用于父进程需要同时处理多项任务的场景(如服务器轮询子进程状态)。
  • WUNTRACED:捕获子进程暂停事件(如收到 SIGSTOPSIGTSTP)。主要用于调试器实现(如 GDB 断点)。
  • WCONTINUED:捕获子进程恢复运行事件(收到 SIGCONT)。用于追踪进程完整生命周期。

回收时机:父进程应在子进程终止后尽快调用 wait 回收。如果父进程不回收,子进程将变成僵尸进程。如果父进程先终止,子进程被 init 进程(PID=1)收养并自动回收。

链接到