我在Ubuntu虚拟机上玩fork和signals。具体来说,我尝试分叉生成一个子进程,然后从父进程向该子进程发送一个SIGTSTP。在这一点之后,我尝试使用waitpid查询它的状态两次
man
-欠理解,等待函数族仅报告
更改
到状态;即:相对于该PID的该族函数的最后一次调用的更改。事实上,对waitpid的第二次调用并没有报告子进程已经停止(它的返回值是0,而不是子进程的PID)。
(为了澄清:我将waitpid与WUNTRACED和子进程的PID(fork的返回值)一起用作第一个参数。)
我想知道:有没有一种方法可以让我在不调用ps等外部二进制文件的情况下查询子进程的状态,而不管之前是否调用过wait like,或者理论上我必须自己为每个子进程维护某种状态?
换一种说法,以防我的措辞令人困惑:假设我生成了一堆子进程,我想监控其中哪些仍在运行,哪些已停止(通过SIGTSTP或SIGSTOP),哪些已终止。我可以自己维护状态(例如使用SIGCHLD处理程序),但我想尝试使用操作系统为我做这件事(我认为这确实是因为,例如,ps显示了系统中每个进程的状态,所以我想访问它)。第一个和最后一个使用kill(pid,0)调用很容易监控,但第二个进程是否已停止似乎更难查询。我们该怎么做呢?