代码之家  ›  专栏  ›  技术社区  ›  Shay

`waitpid`一个已经被waitpid'处理的进程

  •  0
  • Shay  · 技术社区  · 2 年前

    我在Ubuntu虚拟机上玩fork和signals。具体来说,我尝试分叉生成一个子进程,然后从父进程向该子进程发送一个SIGTSTP。在这一点之后,我尝试使用waitpid查询它的状态两次 man -欠理解,等待函数族仅报告 更改 到状态;即:相对于该PID的该族函数的最后一次调用的更改。事实上,对waitpid的第二次调用并没有报告子进程已经停止(它的返回值是0,而不是子进程的PID)。

    (为了澄清:我将waitpid与WUNTRACED和子进程的PID(fork的返回值)一起用作第一个参数。)

    我想知道:有没有一种方法可以让我在不调用ps等外部二进制文件的情况下查询子进程的状态,而不管之前是否调用过wait like,或者理论上我必须自己为每个子进程维护某种状态?

    换一种说法,以防我的措辞令人困惑:假设我生成了一堆子进程,我想监控其中哪些仍在运行,哪些已停止(通过SIGTSTP或SIGSTOP),哪些已终止。我可以自己维护状态(例如使用SIGCHLD处理程序),但我想尝试使用操作系统为我做这件事(我认为这确实是因为,例如,ps显示了系统中每个进程的状态,所以我想访问它)。第一个和最后一个使用kill(pid,0)调用很容易监控,但第二个进程是否已停止似乎更难查询。我们该怎么做呢?

    1 回复  |  直到 2 年前
        1
  •  1
  •   thejh    2 年前

    您可以使用与以下工具相同的界面 ps 将使用:读取文件的内容 /proc/[pid]/stat (请参阅 the proc.5 manpage) 第三字段是指示过程状态的单个字母,例如, T 表示“在信号上停止”,以及 t 表示“跟踪停止”(由于 ptrace() )。

    请注意,您通常只能监视进程的状态,直到通过 waitpid() 指示进程已终止的调用。在这一点之后,进程可以消失,PID可以由完全不相关的进程重新使用。