3

我们可以通过shell命令行检测一些是否是僵尸进程

ps ef -o pid,stat | grep <pid> | grep Z

为了在我们使用的 C/C++ 程序中获取该信息popen(),但我们想避免使用popen(). 有没有办法在不产生额外进程的情况下获得相同的结果?

我们使用的是 Linux 2.6.32-279.5.2.el6.x86_64。

4

1 回答 1

7

您需要使用proc(5)文件系统。访问其中的文件(例如/proc/1234/stat...)非常快(它不涉及任何物理 I/O)。

您可能想要第三个字段/proc/1234/stat(每个人都可以阅读,但您应该按顺序阅读它,因为它是不可搜索的。)。如果该字段是Zpid 1234 的进程是僵尸。

无需 fork 进程(例如使用popenor system),您可以在 C 中编写代码

pid_t somepid;
// put the process pid you are interested in into somepid

bool iszombie = false;
// open the /proc/*/stat file
char pbuf[32];
snprintf(pbuf, sizeof(pbuf), "/proc/%d/stat", (int) somepid);
FILE* fpstat = fopen(pbuf, "r");
if (!fpstat) { perror(pbuf); exit(EXIT_FAILURE); };
{
  int rpid =0; char rcmd[32]; char rstatc = 0;
  fscanf(fpstat, "%d %30s %c", &rpid, rcmd, &rstatc); 
  iszombie = rstatc == 'Z';
}
fclose(fpstat);

也考虑一下procpslibproc看看这个答案

(您也可以阅读第二行,/proc/1234/status但这可能更难用 C 或 C++ 代码解析)

顺便说一句,我发现该stat文件/proc/的格式很奇怪:如果您的可执行文件的名称中恰好包含空格和括号(这很恶心,但允许),那么解析/proc/*/stat文件就会变得棘手。

于 2013-05-05T09:03:25.960 回答