检测Linux上的pid是否是僵尸

时间:2013-05-05 09:00:00

标签: linux popen zombie-process

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

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

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

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

1 个答案:

答案 0 :(得分:6)

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

你可能想要来自/proc/1234/stat的第三个字段(每个人都可以读取,但是你应该按顺序读取它,因为它是不可见的。)。如果该字段为Z,那么pid 1234的过程就是僵尸。

无需分叉流程(例如,使用popensystem),在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,请参阅this answer

(您还可以阅读/proc/1234/status的第二行,但这可能在C或C ++代码中难以解析)

顺便说一句,我发现stat中的/proc/文件有一种奇怪的格式:如果你的可执行文件恰好在其名称中包含空格和括号(这很恶心,但允许)解析{ {1}}文件变得棘手。