我怎样可以在Linux下使用C语言获取进程状态信息(例如,是否为僵尸进程)?
阅读到目前为止的答案后,我想要进一步缩小我的问题:我希望有一个纯C的解决方案。在阅读了ps源码(它读取/proc/)之后,我认为应该有更好的方法,并在这里询问 :)
我怎样可以在Linux下使用C语言获取进程状态信息(例如,是否为僵尸进程)?
阅读到目前为止的答案后,我想要进一步缩小我的问题:我希望有一个纯C的解决方案。在阅读了ps源码(它读取/proc/)之后,我认为应该有更好的方法,并在这里询问 :)
您需要学习通过典型的C标准库调用与“伪文件系统”/proc/交互。开始所需的文档包含在任何Linux发行版中,并且只需进行简单的谷歌搜索即可。
既然你知道要搜索什么了,我知道这通常是最具挑战性的部分!
简而言之,运行中的Linux系统中/proc/目录中的目录和文件反映了运行中内核的状态,其中(自然地)包括进程。但是,在您冲入之前,您需要牢记一些信息。
一个僵尸进程不是一个孤儿进程。孤儿进程是在进程父亲不正确退出后保留运行的等待状态进程。僵尸进程是在正确退出并释放所有资源后仍在进程表中保留位置的进程。
这通常发生在程序启动进程时。您知道,内核直到父进程正确获取子进程的返回状态之前,才不会从进程表中删除已完成的子进程条目。这很有道理;否则父进程如何知道子进程是否不正常退出呢?
因此,所有子过程在技术上都是至少非常短的时间为僵尸进程。这对于一个程序来说并不是天生的不良状态。
事实上,“僵尸”有时是有意创建的。例如,有时程序会将僵尸条目保留一段时间,以便更进一步启动的进程不会获得与之前启动的(现在是僵尸的)进程相同的PID。
换句话说,如果你不必要地去SIGCHLD僵尸进程,你可能会为生成程序创建严重的问题。然而,如果一个进程已经成为僵尸状态半个小时或更长时间了,这可能是一个错误的迹象。
编辑:问题转变了!不,没有比ps更简单的方法了。如果有的话,它早就被整合到ps中了。/proc文件是内核状态信息的万能来源。 :)
我只知道两种方法:
ps
commandps
does internally)你想要运行在你的机器上的进程,那么就使用
$ ps aux $ ps aux可以翻译为: $ ps aux
ps 显示有关一组活动进程的信息。如果您想要重复更新选择和显示的信息,请改用 top。
Pseudo file system /proc is describing kernel internal data structures and gives to you opportunity to alter some values directly. Obtaining state of particular process can be easily implemented with I/O C functions. The right file to parse is: /proc/{PID}/status
下面的命令可以用来获取僵尸状态的进程。
for proc in $(echo /proc/[0-9]*);do if [[ $(sed -n /^State: Z/p ${proc}/status 2>/dev/null) ]];then basename $proc;fi;done
在这里找到:这里:
Use this command to display all of your zombie processes:
ps aux | awk { print $8 " " $2 } | grep -w Z
这可以很容易地使用C语言解析。