未调用waitpid时僵尸进程为何会在htop中自动消失?
现象原因说明
1. 僵尸进程的生成逻辑
你提供的两段C代码运行后都会产生持续存在的僵尸子进程:
- 第一段代码没有处理SIGCHLD信号,父进程默认忽略该信号,子进程退出后会保留PCB资源等待父进程回收,进入僵尸状态。
- 第二段代码仅设置了空的SIGCHLD信号回调,没有在回调中调用
wait()/waitpid()回收子进程资源,因此子进程依然会进入僵尸状态,只有将信号处理函数设置为SIG_IGN或者在回调中完成回收逻辑,才会避免僵尸进程生成。
2. htop看不到僵尸进程的核心原因
这不是htop的bug,属于默认配置导致的显示差异,常见原因如下:
- 部分Linux发行版的htop默认开启了隐藏僵尸进程的选项:你可以按
F2进入htop设置界面,选择「Display options」,检查是否勾选了Hide zombie processes,取消该勾选后就能看到所有僵尸进程。 - htop默认按CPU使用率降序排序:僵尸进程不占用任何CPU资源,若系统运行进程较多,僵尸进程会被排序到列表底部,未滚动到对应位置就会误以为进程消失。你可以按
F5切换为树状视图,直接找到父进程展开,就能看到挂载在其下的僵尸子进程。 - 你也可以直接在htop界面按
z键,开启僵尸进程高亮功能,存在的僵尸进程会被特殊颜色标记,可快速定位。
3. top能正常显示的原因
top默认没有隐藏僵尸进程的配置,且会在统计行明确标注僵尸进程总数,列表也不会默认过滤Z状态的进程,因此可以正常看到对应的僵尸进程。
内容的提问来源于stack exchange,提问作者Vadim Novoshinskiy
相关产品推荐
相关产品推荐

