【问题标题】:Detect if pid is zombie on Linux检测 pid 在 Linux 上是否为僵尸
【发布时间】:2013-05-05 08:59:59
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: linux popen zombie-process


    【解决方案1】:

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

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

    无需 fork 进程(例如 withpopensystem),您可以在 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++ 代码中更难解析)

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

    【讨论】:

    • 谢谢,但在这种情况下,我们需要在 C/C++ 程序中使用 popen()。我需要避免使用 popen()
    • @Alex:你不需要popen()来访问/proc,使用普通的open()fopen()即可。
    • 还有一个问题。如果我没有使用 的权限,我可以读取 proc//proc 吗? 可能是另一个所有者的进程。
    • 是的,您可以阅读不属于您的某些进程的/proc/1234/stat
    • 如果可执行文件的权限是700?而且可执行文件不是我的?
    猜你喜欢
    • 2012-03-20
    • 2013-09-25
    • 1970-01-01
    • 1970-01-01
    • 2012-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多