僵尸进程(Zombie Process)是指已经终止但其退出状态尚未被父进程读取(通过wait()
或waitpid()
系统调用)的进程。在Linux系统中,这种进程被称为"僵尸"(Zombie)或"defunct"进程。
kill
命令杀死ps
或top
命令中显示为Z
或defunct
僵尸进程通常由以下情况引起:
wait()
或waitpid()
来获取子进程的退出状态使用以下命令查看僵尸进程:
ps aux | grep 'Z'
# 或者
top # 查看状态为Z的进程
输出示例:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
user 12345 0.0 0.0 0 0 pts/0 Z 10:00 0:00 [process_name] <defunct>
wait()
或waitpid()
bash
kill -9 父进程PID
waitpid()
非阻塞方式回收子进程在编写会产生子进程的程序时,应该:
// 设置SIGCHLD处理函数
signal(SIGCHLD, sigchld_handler);
void sigchld_handler(int sig) {
while (waitpid(-1, NULL, WNOHANG) > 0);
}
或者使用更现代的sigaction
:
struct sigaction sa;
sa.sa_handler = sigchld_handler;
sigemptyset(&sa.sa_mask);
sa.sa_flags = SA_RESTART | SA_NOCLDSTOP;
if (sigaction(SIGCHLD, &sa, NULL) == -1) {
perror("sigaction");
exit(1);
}
僵尸进程本身不会消耗系统资源(除进程表项外),但大量僵尸进程可能导致进程表耗尽。良好的编程实践可以避免僵尸进程的产生。