我在 Ubuntu 虚拟机上玩 fork 和信号。具体来说,我尝试分叉生成一个子进程,然后从父进程向该子进程发送一个 SIGTSTP。在这一点之后,我尝试使用 waitpid 查询它的状态两次——根据我
man
的理解,wait 函数族只报告状态的 changes;即:相对于此 PID 对该系列函数的最后一次调用的更改。事实上,第二次调用 waitpid 并没有报告孩子已经停止(它的返回值是 0 而不是孩子的 PID)。
(澄清一下:我使用了带有 WUNTRACED 的 waitpid 和孩子的 PID,作为 fork 的返回值,作为第一个参数。)
我在想:有没有办法让我查询子进程的状态,而不管之前对等待的任何调用,而不调用像 ps 这样的外部二进制文件,或者理论上我是否必须自己为每个子进程维护某种状态
换句话说,以防万一我的措辞令人困惑:假设我生成了一堆子进程,我想监视其中哪些仍在运行,哪些已经停止(通过 SIGTSTP 或 SIGSTOP),哪些已经终止。我可以自己维护状态(例如使用 SIGCHLD 处理程序),但我想尝试使用操作系统为我执行此操作(我认为这确实是由于例如 ps 显示每个系统中的进程——所以我想访问它)。第一个和最后一个很容易使用 kill(pid, 0) 调用进行监控,但第二个——进程是否已停止——似乎更难以查询。如何解决这个问题?
您可以使用与
ps
等工具相同的界面:阅读文件 /proc/[pid]/stat
的内容(参见 proc.5
联机帮助页)。第三个字段是表示进程状态的单个字母 - 例如,T
表示“停止信号”,t
表示“跟踪停止”(由于 ptrace()
而停止)。
请注意,您通常只能监视进程的状态,直到通过指示进程已终止的
waitpid()
调用“收割”该进程。在那之后,进程可以消失,PID 可以被完全不相关的进程重用。