我在Ubuntu VM上玩fork和signals。具体地说,我尝试分叉来产生一个子进程,然后从父进程向该子进程发送SIGTSTP。在此之后,我尝试使用waitpid查询它的状态两次-据我的理解,wait函数家族只报告状态的 * 更改 *;即:相对于对该PID的该族函数的最后一次调用而改变。事实上,第二次调用waitpid并没有报告子节点已经停止(它的返回值是0,而不是子节点的PID)。
(To clarify:我使用了waitpid和WUNTRACED,孩子的PID,作为fork的返回值,作为第一个参数。
我在想:有没有一种方法可以让我查询一个子进程的状态,而不管之前对wait-likes的任何调用,而不调用外部的二进制文件,比如ps,或者理论上我必须自己为每个子进程维护某种状态?
换个说法,以防我的措辞令人困惑:假设我产生了一堆子进程,我想监视哪些子进程仍在运行,哪些子进程已停止(通过SIGTSTP或SIGSTOP),哪些子进程已终止。我可以自己维护状态(例如使用SIGCHLD处理程序),但我想尝试使用操作系统来完成这一点(我认为这确实是因为,例如,ps显示系统中每个进程的状态-所以我想访问它)。使用kill(pid,0)调用监控第一个和最后一个很简单,但是第二个-进程是否停止-似乎查询起来更棘手。如何才能做到这一点呢?
1条答案
按热度按时间ffx8fchx1#
您可以使用与
ps
等工具相同的接口用途:读取文件/proc/[pid]/stat
的内容(请参见theproc.5
manpage)。第三个字段是单个字母,表示进程状态-例如,T
表示“在信号上停止”,t
表示“跟踪停止”(由于ptrace()
而停止)。请注意,通常只能监视进程的状态,直到通过
waitpid()
调用“获取”该进程,该调用指示该进程已终止。在此之后,进程可以消失,PID可以由完全不相关的进程重用。