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

时间:2009-03-11 13:55:01

标签: c linux process zombie-process

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

到目前为止,在阅读了答案之后,我想稍微缩小一下我的问题:我更喜欢纯粹的C解决方案。在阅读了ps源代码(读取/ proc /)后,我认为应该有更好的方法并在此处询问:)

5 个答案:

答案 0 :(得分:7)

您需要了解通过典型的C标准库调用与/ proc /“psuedo-filesystem”进行交互。任何Linux发行版都包含了入门所需的文档,并且是一个简单的谷歌搜索。

(现在你知道要搜索什么。我知道这通常是挑战的大部分!)

简而言之,正在运行的Linux系统的/ proc /目录中的目录和文件反映了正在运行的内核的状态,它自然地包含进程。但是,在你收费之前,你需要记住一些信息。

僵尸进程与孤儿进程不同。孤立进程是在进程'父进程未正确退出后仍处于等待状态的进程。僵尸进程是一个已正确退出,释放其所有资源但正在进程表中保留位置的进程。

这通常在程序启动进程时发生。你看,在父程序正确获取子进程的返回状态之前,内核不会删除进程表中已完成的子进程的条目。那讲得通;如果子进程退出不正确,父程序还能知道吗?

因此,所有子过程在技术上都是僵尸至少很短的时间。对于一个程序而言,这并不是一个糟糕的状态。

事实上,“僵尸”有时是故意制造的。例如,有时僵尸条目由程序保留一段时间,以便进一步启动的进程不会获得与先前启动(现在是僵尸)进程相同的PID。

换句话说,如果你不必要地进行SIGCHLDing僵尸进程,你可能会对产生程序造成严重问题。但是,如果一个进程已经僵尸半小时或更长时间,那可能是一个错误的迹象。

编辑:问题在我身上发生了变化!不,没有比ps更简单的方法。如果有的话,它很久以前就会被整合到ps中。 / proc文件是有关内核状态信息的全部源代码。 :)

答案 1 :(得分:2)

我只知道两种方式:

  • 解析ps命令的输出
  • 读取/ proc / PID中的文件,其中PID是进程标识符(内部ps执行的内容)

答案 2 :(得分:2)

您希望机器上运行的进程使用

$ ps aux

ps 显示有关所选活动进程的信息。如果您想重复更新选择和显示的信息,请改用顶部

答案 3 :(得分:0)

找到here

Use this command to display all of your zombie processes:

ps aux | awk '{ print $8 " " $2 }' | grep -w Z

这可以使用C。

轻松解析

答案 4 :(得分:0)

伪文件系统/ proc正在描述内核内部数据结构,并为您提供直接更改某些值的机会。 使用I / O C函数可以轻松实现获取特定进程的状态。要解析的正确文件是: / proc / {PID} / status

下面的命令可用于获取Zombie状态的进程。

for proc in $(echo /proc/[0-9]*);do if [[ $(sed -n '/^State:\tZ/p' ${proc}/status 2>/dev/null) ]];then basename $proc;fi;done