进程地址空间
僵死进程
子进程先于父进程结束,父进程没有(wait)获取子进程的退出码
父进程先结束,子进程变成孤儿进程,然后系统会为子进程重新指派父进程(init pid=1)
关键特征:
- 进程已经死亡,不再运行
- 但在进程表中仍占有一个条目(PID未被释放)
- 保留着退出状态码、CPU时间统计等信息
- 无法被kill -9杀死(因为已经死了)
观察僵死进程:

如果没有僵死状态,子进程退出后立即被完全清理,父进程就无法知道:
- 子进程是正常退出还是被信号杀死?
- 退出码是多少?
- 运行了多长时间?
僵死进程的危害
主要问题:
- 占用系统资源: 每个僵死进程占用一个PID号
- PID耗尽攻击: 如果大量产生僵死进程不回收,可能导致系统无法创建新进程
- 资源泄漏: 进程表项、内存描述符等资源无法释放
如何避免和清理僵死进程?



如何查找和手动清理僵死进程?
# 查找僵死进程
ps aux | awk '$8=="Z" {print $2, $11}'
# 杀死父进程(会自动回收所有子进程)
kill -9 <parent_pid>
为什么kill -9杀不死僵死进程?
因为僵死进程已经死了,它不响应任何信号。只能通过杀死其父进程来回收。
在什么场景下容易产生僵死进程?
服务器程序中频繁创建短命子进程
父进程忘记调用wait/waitpid
信号处理设置不当(如忽略SIGCHLD)
wait = 等待子进程结束 + 回收僵死进程(sys/wait.h)
wait确实就是回收进程,但如果没有僵死进程可回收时,它会先等待。