在 Linux 中,僵尸进程(Zombie Process)本质上是已经结束运行、但还没有被父进程“收尸”的进程。要理解为什么会变成僵尸,需要先看进程退出时的机制。
SIGCHLD 信号wait() / waitpid()
✅ 如果父进程及时 wait,进程不会变成僵尸
❌ 如果父进程不 wait,进程就会一直保持“僵尸状态”
wait() / waitpid()最常见原因。
例如:
fork();
// 父进程什么都不做
子进程退出后:
SIGCHLD 信号有些程序会写:
signal(SIGCHLD, SIG_IGN);
在某些旧 UNIX 上这会导致不回收子进程
(Linux 上通常仍可自动回收,但不推荐依赖)
比如:
SIGCHLD这种情况子进程会被 init / systemd(PID 1)接管
由 PID 1 负责回收
✅ 所以孤儿进程 ≠ 僵尸进程
常见于:
Zps aux | grep Z
或:
top
# 看 Tasks: 1 zombie
waitpid(pid, &status, 0);
或使用:
signal(SIGCHLD, sigchld_handler);
kill -9 父进程PID
forkSIGCHLDLinux 进程变成僵尸,是因为它已经死了,但父进程没有“收尸”。
如果你愿意,我也可以:
wait / waitpid 的区别