c - 如何确定进程的状态(即它是否是僵尸进程)

标签 c linux process zombie-process

如何在 Linux 下使用 C 获取有关进程状态的信息(即,如果它是僵尸进程)?

阅读到目前为止的答案后,我想缩小我的问题范围:我更喜欢纯 C 解决方案。在阅读了 ps 源代码(读取/proc/)后,我认为应该有更好的方法并在这里询问:)

最佳答案

您将想要了解如何通过典型的 C 标准库调用与/proc/“伪文件系统”进行交互。入门所需的文档包含在任何 Linux 发行版中,只需通过简单的谷歌搜索即可。

(现在您知道要搜索什么了。我知道这通常是最大的挑战!)

简而言之,正在运行的 Linux 系统的/proc/目录中的目录和文件反射(reflect)了正在运行的内核的状态,其中(自然地)包括进程。但是,在充电之前,您需要牢记一些信息。

僵尸进程与孤立进程不同。孤立进程是进程的父进程错误退出后处于等待状态的进程。僵尸进程是已经正常退出、释放了所有资源但在进程表中保留一个位置的进程。

这通常发生在程序启动进程时。您会看到,在父程序正确获取子进程的返回状态之前,内核不会删除进程表中已完成的子进程的条目。这就说得通了;否则父程序如何知道子进程是否异常退出?

所以所有子进程在技术上至少在很短的时间内都是僵尸进程。对于程序来说,它本身并不是一个坏状态。

的确,“僵尸”有时是有意创造的。例如,有时程序会在某个位置保留一个僵尸条目一段时间,这样进一步启动的进程将不会获得与先前启动的(现在是僵尸)进程相同的 PID。

换句话说,如果您对僵尸进程发出不必要的 SIGCHLD 信号,您可能会给生成程序造成严重的问题。但是,如果一个进程已成为僵尸进程半小时或更长时间,则可能是出现错误的迹象。

编辑:我的问题变了!不,没有比 ps 更简单的方法了。如果有的话,早就集成到ps中了。/proc 文件是关于内核状态信息的最重要的来源。 :)

关于c - 如何确定进程的状态(即它是否是僵尸进程),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/634608/

相关文章:

c - 为什么这个c程序会陷入死循环?

linux - 在 Linux 中记录内存占用

linux - shell 测试条件错误

java - 我只是用java编写了一个wrapcommand,但有时它不打印命令输出。为什么

java - 从 Web 应用程序停止 Android 进程

c - 并行冒泡排序被阻止

将 C dll 头文件转换为 Delphi Pascal 头文件

c - C 中的堆头和 free()

python - 如何自动回答python中的脚本

php - 从后台进程启动后台进程