如何等待非subprocess退出
对于subprocess,可以使用wait()
和waitpid()
函数暂停当前进程的执行,直到subprocess退出。 但是这个函数不能用于非subprocess。
是否还有另一个function,可以等待任何进程退出?
没有什么等于wait()
。 通常的做法是使用kill(pid, 0)
进行轮询kill(pid, 0)
然后查找ESRCH
返回值-1和errno
来指示进程已经结束。
在BSD和OS X上,您可以使用带有EVFILT_PROC + NOTE_EXIT的kqueue来完成此操作。 不需要轮询。 不幸的是,没有Linux的等价物。
到目前为止,我已经find了三种在Linux上执行此操作的方法:
- 轮询:通过使用
kill
或通过testing/proc/$pid
的存在来检查进程是否经常存在,就像在大多数其他答案中一样 - 使用
ptrace
系统调用来像debugging器一样连接到进程,以便在退出时得到通知,如在a3nm的答案中 - 使用
netlink
接口来监听PROC_EVENT_EXIT
消息 – 这样内核就会在每次进程退出时告诉你的程序,并等待正确的进程ID。 我只在互联网上看到过这一点。
无耻的插件:我正在开发一个程序 (当然是开源的,GPLv2),可以做三者之一。
你也可以创build一个套接字或一个FIFO并读取它们。 FIFO非常简单:将孩子的标准输出与FIFO连接并读取。 读取将阻塞,直到孩子退出(出于任何原因)或直到它发出一些数据。 所以你需要一个循环来放弃不需要的文本数据。
如果您有权访问孩子的来源,请在开始时打开FIFO进行写作,然后简单地将其忘记。 当孩子终止时,操作系统将清除打开的文件描述符,并且等待的“父母”进程将被唤醒。
现在这可能是一个你没有开始或者拥有的过程。 在这种情况下,您可以用启动真实二进制文件的脚本代替二进制可执行文件,但也可以像上面所解释的那样添加监视。
您可以使用ptrace(2)
附加到进程。 从shell中, strace -p PID >/dev/null 2>&1
似乎工作。 这避免了繁忙的等待,虽然它会减慢跟踪的进程,并不会在所有进程(只有你的,这比只有subprocess好一点)的工作。
没有我知道。 除了混乱的解决scheme之外,如果您可以更改要等待的程序,则可以使用信号量。
库函数是sem_open(3)
, sem_init(3),
sem_wait(3),
…
sem_wait(3)
执行一个等待,所以你不必像混乱的解决scheme那样忙于等待。 当然,使用信号量会让你的程序更加复杂,也不值得麻烦。
也许可以等待/ proc / [pid]或/ proc / [pid] / [something]消失?
有poll()和其他文件事件等待function,也许这可以帮助?