定义
子进程终止后,父进程未调用wait()
/waitpid()
回收其资源,导致子进程残留进程表项(仅占PID和退出状态,不占用CPU/内存)。
状态标识:ps aux
中STAT
列为Z
或z
。
产生原因
SIGCHLD
或未编写回收逻辑)。init
进程接管但未及时回收。检测方法
ps aux | grep '[Zz]'
(过滤出僵尸进程及其父进程PID)。top
/htop
实时查看进程状态。处理方式
wait()
/waitpid()
或注册SIGCHLD
信号处理器自动回收。// 示例:父进程回收子进程
#include <sys/wait.h>
pid_t pid = fork();
if (pid > 0) {
wait(NULL); // 阻塞等待子进程结束
}
SIGCHLD
信号(部分系统支持)。避免策略
waitpid(..., WNOHANG)
实现非阻塞回收。prctl(PR_SET_CHILD_SUBREAPER, 1)
设置子进程为“守护进程”,避免成为僵尸。systemd
等工具自动管理进程生命周期。高级场景
cron
定时检测并处理僵尸进程(需注意避免误杀关键进程)。/proc/sys/kernel/pid_max
增大进程表容量(仅适用于极端场景)。kill
无效,需通过父进程回收。参考资料: