`waitpid` 一个已经被 `waitpid`ed 的进程

问题描述 投票:0回答:1

我在 Ubuntu 虚拟机上玩 fork 和信号。具体来说,我尝试分叉生成一个子进程,然后从父进程向该子进程发送一个 SIGTSTP。在这一点之后,我尝试使用 waitpid 查询它的状态两次——根据我

man
的理解,wait 函数族只报告状态的 changes;即:相对于此 PID 对该系列函数的最后一次调用的更改。事实上,第二次调用 waitpid 并没有报告孩子已经停止(它的返回值是 0 而不是孩子的 PID)。

(澄清一下:我使用了带有 WUNTRACED 的 waitpid 和孩子的 PID,作为 fork 的返回值,作为第一个参数。)

我在想:有没有办法让我查询子进程的状态,而不管之前对等待的任何调用,而不调用像 ps 这样的外部二进制文件,或者理论上我是否必须自己为每个子进程维护某种状态

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

linux process signals child-process
1个回答
1
投票

您可以使用与

ps
等工具相同的界面:阅读文件
/proc/[pid]/stat
的内容(参见
proc.5
联机帮助页)
。第三个字段是表示进程状态的单个字母 - 例如,
T
表示“停止信号”,
t
表示“跟踪停止”(由于
ptrace()
而停止)。

请注意,您通常只能监视进程的状态,直到通过指示进程已终止的

waitpid()
调用“收割”该进程。在那之后,进程可以消失,PID 可以被完全不相关的进程重用。

© www.soinside.com 2019 - 2024. All rights reserved.