【问题标题】:How to determine the state of a process (i.e. if it is a zombie)如何确定进程的状态(即是否为僵尸)
【发布时间】:2009-03-11 13:55:00
【问题描述】:

如何在 Linux 下使用 C 获取有关进程状态(即是否为僵尸)的信息?

阅读到目前为止的答案后,我想稍微缩小我的问题范围:我更喜欢纯 C 解决方案。在阅读了 ps 源代码(读取 /proc/)后,我认为应该有更好的方法并在这里问:)

【问题讨论】:

  • 您想避免解析/proc 中的文本文件吗?据我所知,没有其他办法。
  • 编辑而不是评论来改变问题。

标签: c linux process zombie-process


【解决方案1】:

您需要了解如何通过典型的 C 标准库调用与 /proc/“伪文件系统”进行交互。任何 Linux 发行版都包含入门所需的文档,只需 google 搜索即可。

(现在您知道要搜索什么了。我知道这通常是最大的挑战!)

简而言之,正在运行的 Linux 系统的 /proc/ 目录中的目录和文件反映了正在运行的内核的状态,其中(自然)包括进程。但是,在您收费之前,您需要记住一些信息。

僵尸进程与孤立进程不同。孤立进程是在进程的父进程错误退出后处于等待状态的进程。僵尸进程是一个已经正常退出,释放了所有资源,但在进程表中保持位置的进程。

这通常发生在程序启动进程时。您会看到,在父程序正确获取子进程的返回状态之前,内核不会删除进程表中的已完成子进程的条目。这就说得通了;如果子进程不正确退出,父程序怎么知道?

所以从技术上讲,所有子进程至少在很短的时间内都是僵尸。程序本身并不是一个糟糕的状态。

确实,“僵尸”有时是故意创建的。例如,有时程序会在一段时间内留下一个僵尸条目,以便进一步启动的进程不会获得与之前启动(现在是僵尸)进程相同的 PID。

换句话说,如果你不必要地对僵尸进程进行 SIGCHLDing,你可能会给生成程序带来严重的问题。但是,如果一个进程已经成为僵尸半小时或更长时间,这可能是一个错误的迹象。

编辑:我的问题变了!不,没有比 ps 更简单的方法了。如果有的话,早就集成到ps里面了。 /proc 文件是内核状态信息的全部来源。 :)

【讨论】:

  • 很好地讨论了针对不太成熟的观众的任务
  • 您的回答让我重新思考修复父母没有正确等待孩子的错误的方法。我重新分析了代码,找到了父母错过等待孩子的地方。谢谢
【解决方案2】:

我只知道两种方法:

  • 解析ps 命令的输出
  • 读取 /proc/PID 中的文件,其中 PID 是进程标识符(这是 ps 在内部所做的)

【讨论】:

  • 我觉得你应该澄清一下
【解决方案3】:

您希望进程在您的机器上运行,然后使用

$ ps 辅助

ps 显示有关活动进程选择的信息。如果您想要重复更新选择和显示的信息,请改用 top

【讨论】:

  • 是的,我想 TOP 是个好主意。只需要在 C 中解析即可。
  • 我认为“使用 C”意味着在 c 程序中(即不在命令提示符下),而“在 Linux 下”告诉你他可以访问哪些 OS API。
  • @dmckee 呵呵,我认识那个家伙。 :)
【解决方案4】:

伪文件系统 /proc 描述内核内部数据结构,并为您提供直接更改某些值的机会。 获取特定进程的状态可以通过 I/O C 函数轻松实现。正确解析的文件是:/proc/{PID}/status

下面的命令可以用来获取僵尸状态的进程。

for proc in $(echo /proc/[0-9]*);do if [[ $(sed -n '/^State:\tZ/p' ${proc}/status 2>/dev/null) ]];then basename $proc;fi;done

【讨论】:

    【解决方案5】:

    找到here:

    Use this command to display all of your zombie processes:
    
    ps aux | awk '{ print $8 " " $2 }' | grep -w Z
    

    这可以使用 C 轻松解析。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-15
      • 2011-03-14
      • 2013-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-04
      • 2015-01-15
      相关资源
      最近更新 更多