定义
子进程终止后,父进程未调用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无效,需通过父进程回收。参考资料: