在Linux中,我怎么能等到我没有开始的进程完成?

时间:2015-10-08 00:04:06

标签: linux process waitpid

我有一个监控程序,我想查看系统中的各种进程,并知道它们何时终止。我也想知道他们的退出代码,以防他们崩溃。但是,我的程序不是要监视的进程的父级。

在Windows中,这很容易:<div class="magnifying-glass">...</div>用于OpenProcess权限,SYNCHRONIZE等待其中任何一个终止,然后WaitForMultipleObjectsEx找出它终止的原因(如果原因是异常,则使用GetExitCodeProcess错误代码。)

但在Linux中,相当于这些NTSTATUS,只适用于您自己的子进程,而不是无关的进程。我们尝试waitpid,但这导致了自己的问题,例如大大减慢了信号处理速度。

此程序旨在以root身份运行。

有没有办法实现这个,除了轮询ptrace直到它消失?

1 个答案:

答案 0 :(得分:0)

无法想出收集终止状态的简单方法,但对于简单的死亡事件,您可以作为root注入ope n调用文件,您将拥有另一端然后你可以在文件描述符的末尾做select。 当另一端死亡时,它会在filedescriptor上生成一个关闭事件,你有另一端。

一个(非常丑陋)的例子:

mkfifo /tmp/fifo #A channel to communicate death events
sleep 1000 &     #Simulate your victim process
echo $! #Make note of the pid you want

 #In another terminal

 sudo gdb -ex "attach $thePid" -ex ' call open("/tmp/fifo",0,0)' -ex  'quit'
 exec 3>/tmp/fifo
 ruby -e 'fd = IO.select([IO.for_fd(3)]); puts "died" '

 #In yet another terminal
 kill $thePid #the previous terminal will print `died` immediately
 #even though it's not the parent of $thePid