如何在Linux下使用C获取有关进程状态的信息(即,如果它是僵尸)?
到目前为止,在阅读了答案之后,我想稍微缩小一下我的问题:我更喜欢纯粹的C解决方案。在阅读了ps源代码(读取/ proc /)后,我认为应该有更好的方法并在此处询问:)
答案 0 :(得分:7)
您需要了解通过典型的C标准库调用与/ proc /“psuedo-filesystem”进行交互。任何Linux发行版都包含了入门所需的文档,并且是一个简单的谷歌搜索。
(现在你知道要搜索什么。我知道这通常是挑战的大部分!)
简而言之,正在运行的Linux系统的/ proc /目录中的目录和文件反映了正在运行的内核的状态,它自然地包含进程。但是,在你收费之前,你需要记住一些信息。
僵尸进程与孤儿进程不同。孤立进程是在进程'父进程未正确退出后仍处于等待状态的进程。僵尸进程是一个已正确退出,释放其所有资源但正在进程表中保留位置的进程。
这通常在程序启动进程时发生。你看,在父程序正确获取子进程的返回状态之前,内核不会删除进程表中已完成的子进程的条目。那讲得通;如果子进程退出不正确,父程序还能知道吗?
因此,所有子过程在技术上都是僵尸至少很短的时间。对于一个程序而言,这并不是一个糟糕的状态。
事实上,“僵尸”有时是故意制造的。例如,有时僵尸条目由程序保留一段时间,以便进一步启动的进程不会获得与先前启动(现在是僵尸)进程相同的PID。
换句话说,如果你不必要地进行SIGCHLDing僵尸进程,你可能会对产生程序造成严重问题。但是,如果一个进程已经僵尸半小时或更长时间,那可能是一个错误的迹象。
编辑:问题在我身上发生了变化!不,没有比ps更简单的方法。如果有的话,它很久以前就会被整合到ps中。 / proc文件是有关内核状态信息的全部源代码。 :)
答案 1 :(得分:2)
我只知道两种方式:
ps
命令的输出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