在 Ubuntu(以及所有 Linux 系统)中,**僵尸进程(Zombie Process)**的产生原因本质上和 Linux 的进程回收机制有关。下面用通俗 + 技术细节两种方式说明。
僵尸进程是一个已经结束运行,但还没有被父进程回收的进程。
exit()状态通常显示为:
Z
或
Zombie
子进程退出后,父进程没有调用
wait()/waitpid()回收子进程的状态
父进程创建子进程
pid = fork();
子进程执行任务后退出
exit(0);
子进程变成僵尸
父进程没有回收
wait()int main() {
if (fork() == 0) {
exit(0); // 子进程退出
}
while (1); // 父进程什么都不做
}
✅ 子进程会立刻变成僵尸
fork()signal(SIGCHLD, SIG_IGN); // 错误用法(某些情况下)
在某些老内核或实现中,可能导致僵尸
init(PID 1)接管ps aux | grep Z
或:
top
看到:
Z
或:
ps -eo pid,ppid,stat,cmd | grep Z
✅ 占用很少资源
❌ 占用 PID
如果僵尸太多:
kill -9 僵尸PID # 无效
wait(NULL);
或waitpid(pid, &status, 0);
kill -9 父进程PID
init(或 systemd)接管✅ 这是最常见、最有效的办法
signal(SIGCHLD, SIG_IGN); // 现代 Linux 下可避免僵尸
或:
while (waitpid(-1, NULL, WNOHANG) > 0);
if (fork() == 0) {
if (fork() == 0) {
// 真正干活
exit(0);
}
exit(0);
}
wait(NULL);
僵尸进程的产生是因为:子进程死了,父进程没管。
如果你愿意,我也可以: