在 Linux 系统编程中,用 fork 创建子进程虽然简单,但一旦忽略子进程退出后的清理工作,僵尸进程就会找上门。它们占用 PID 和内核资源,甚至可能导致系统无法新建进程。进程等待正是解决这一问题的核心机制,不仅能回收子进程资源,还能获取其退出状态(正常结束还是被信号终止)。
为什么需要进程等待
进程等待的必要性主要体现在两个方面:
- 清理僵尸进程:僵尸进程的状态为
Z,其数据和代码会被内核清理,但 PCB(进程控制块)会残留 PID、退出状态等信息。只有父进程通过进程等待才能彻底回收 PCB 资源,否则僵尸进程会长期占用系统资源。 - 获取退出状态:父进程可以拿到子进程的退出信息,以此判断任务执行结果。这对后台服务等需要确保任务可靠性的场景至关重要。
wait 函数基础
wait 是 Linux 系统中让父进程阻塞等待任意一个子进程终止的系统调用。它同时完成资源回收与退出状态获取。
#include <sys/types.h>
#include <sys/wait.h>
pid_t wait(int *status);
成功返回被等待进程的 PID,失败返回 -1。status 参数用于接收退出状态,若不关心可传 NULL。
仅回收资源
当不需要关注子进程具体退出码时,可以直接传 NULL。下面是一个典型的单进程等待示例:
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <stdlib.h>
int main() {
pid_t id = fork();
if (id < 0) {
perror("fork");
return 1;
}
else if (id == 0) {
int cnt = 5;
(cnt--) {
(, getpid());
sleep();
}
();
}
{
cnt = ;
(cnt--) {
(, getpid());
sleep();
}
ret = wait();
(ret > ) {
(, ret);
}
sleep();
}
;
}


