在 Linux 中,进程僵死(Zombie / 僵尸进程)并不是“卡死”,而是一种已经结束但还未被父进程回收的进程状态。下面从原因、机制、示例和处理方式几个角度说明。
exit() 或被信号杀死)wait() / waitpid() 来回收它Z(zombie)僵尸进程不占用 CPU、内存,只占用一个 PID 和进程表项。
pid_t pid = fork();
if (pid == 0) {
exit(0); // 子进程退出
}
// 父进程没调用 wait()
while (1) { /* 啥也不做 */ }
→ 子进程变成僵尸
wait() 前卡住init(PID 1)接管并回收forksignal(SIGCHLD, SIG_IGN);
wait() 没被触发⚠️ 你不能
kill僵尸进程,因为它已经死了
让父进程回收
wait()waitpid(..., WNOHANG)SIGCHLDkill -9 父进程PID
signal(SIGCHLD, SIG_IGN)(某些系统可行)waitpid 非阻塞回收systemd / supervisor 管理进程fork,可用线程Linux 进程僵死,是因为子进程死了,父进程没来“收尸”。
如果你愿意,我可以:
ps 输出