我有一个监控程序,我想查看系统中的各种进程,并知道它们何时终止。我也想知道他们的退出代码,以防他们崩溃。但是,我的程序不是要监视的进程的父级。
在Windows中,这很容易:<div class="magnifying-glass">...</div>
用于OpenProcess
权限,SYNCHRONIZE
等待其中任何一个终止,然后WaitForMultipleObjectsEx
找出它终止的原因(如果原因是异常,则使用GetExitCodeProcess
错误代码。)
但在Linux中,相当于这些NTSTATUS
,只适用于您自己的子进程,而不是无关的进程。我们尝试waitpid
,但这导致了自己的问题,例如大大减慢了信号处理速度。
此程序旨在以root身份运行。
有没有办法实现这个,除了轮询ptrace
直到它消失?
答案 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