【发布时间】:2012-02-04 21:10:57
【问题描述】:
我想要做的是让一个子进程在后台运行,而父进程去做其他事情。当孩子回来时,我想让父母得到那个状态并用它做点什么。但是,我不想在任何时候明确地等待孩子。
我查看了 waitpid 的 WNOHANG 选项,但这似乎与我正在寻找的有点不同。 WNOHANG 仅在完成后才获得状态,否则继续。理想情况下,我想要一些选项,它不会等待该过程,而是会在完成后跳回并获取返回状态。
有什么办法吗?
代码示例:
pid_t p = fork();
if (p == 0){
value = do_child_stuff();
return(value);
}
if (p > 0){
captureStatus(p, &status); //NOT A REAL FUNCTION
// captureStatus will put p's exit status in status
// whenever p returns, without waiting or pausing for p
//do other stuff.....
}
有什么方法可以模拟 captureStatus 的行为吗?
【问题讨论】:
-
您可以在单独的线程中启动,然后在需要时使用某种并行编程魔法来获得结果:)
-
如果你不知道
status什么时候会有一个有效值,那么captureStatus(p, &status)有什么用? -
是的,我现在转向 Dmitri 的观点 - 如果您要经常检查
status,为什么不在那些时候使用非阻塞waitpid?跨度> -
@dmitri 我意识到这是一件很奇怪的事情。它涉及一个程序,其中多个命令同时运行并且其他命令相互依赖。在依赖项之一完成执行时,依赖于它的命令将开始执行。基本上,我一直在轮询,当该状态具有有效值时,我运行另一个命令。
-
问题是,在您知道进程已退出并且
status已设置之前,您将无法依赖status。因此,如果您正在轮询它,您也可以使用非阻塞waitpid()——否则您仍然需要一些 other 方法来指示status何时具有有效值。你怎么知道status中的垃圾值和子进程的返回值之间的区别?