Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Linux中,我怎么能等到一个我没有的进程';开始和结束?_Linux_Process_Waitpid - Fatal编程技术网

在Linux中,我怎么能等到一个我没有的进程';开始和结束?

在Linux中,我怎么能等到一个我没有的进程';开始和结束?,linux,process,waitpid,Linux,Process,Waitpid,我有一个监控程序,我想检查系统中的各个进程,并知道它们何时终止。我还想知道他们的退出密码,以防他们崩溃。但是,我的程序不是要监视的进程的父进程 在Windows中,这很容易:OpenProcess对于SYNCHRONIZE权限,WaitForMultipleObjectsEx等待其中任何一个权限终止,然后GetExitCodeProcess找出终止的原因(如果原因是异常,则使用NTSTATUS错误代码) 但是在Linux中,这些的等价物,waitpid,只在您自己的子进程上工作,而不是在不相关的

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

在Windows中,这很容易:
OpenProcess
对于
SYNCHRONIZE
权限,
WaitForMultipleObjectsEx
等待其中任何一个权限终止,然后
GetExitCodeProcess
找出终止的原因(如果原因是异常,则使用
NTSTATUS
错误代码)

但是在Linux中,这些的等价物,
waitpid
,只在您自己的子进程上工作,而不是在不相关的进程上工作。我们尝试了
ptrace
,但这导致了它自身的问题,比如信号处理速度大大减慢

此程序打算以root用户身份运行


除了轮询
/proc/12345
直到它消失之外,还有什么方法可以实现这一点吗?

想不出一种简单的方法来收集终止状态,但是对于简单的死亡事件,您可以作为root,将
ope
n调用注入另一端的文件,然后在文件描述符的一端执行
select
。 当另一端死亡时,它将在另一端的filedescriptor上生成一个close事件

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


你能用ptrace发布一个简单的例子吗?在linux中,这看起来是正确的方法,但也许可以改进。
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