如何等待非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,也许这可以帮助?