2016-09-28 51 views
4

我知道还有另一个同名的线程,但这实际上是一个不同的问题。分叉进程的执行顺序

当进程分叉多次时,父节点是否在子节点之前完成执行?反之亦然?同时?

下面是一个例子。假设我有一个for循环,将1个父进程分为4个子进程。在for循环结束时,我希望父进程通过管道将一些数据提供给子进程。数据被写入每个子进程的相应stdin。

在任何孩子执行他们的代码之前,父母会先发送数据吗?这很重要,因为我们不希望它从一个无效的stdin开始工作。

+1

当进程分叉多次时,父节点在子节点之前是否完成执行?反之亦然?同时? - 同时取决于调度程序及其不可预测性。 –

+0

您可以使用等待函数调用等待子进程完成,然后父进程将执行 –

+0

如何获取子进程的管道?这不是'popen()'的设计目的吗? (另外,'fork()'返回后,应该存在两个进程,所以在那个时候,无论你在哪一个进程中,一个完整的子进程应该存在有效的标准输入和标准输出) – ebyrob

回答

0

它们将同时执行。这基本上就是流程的重点。

研究互斥锁或其他方式来处理并发。

6

执行顺序由特定的操作系统调度策略决定,不受任何保证。为了同步这些过程,有专门为此设计的用于进程间通信(IPC)的特殊设施。提到的管道就是一个例子。他们使读取过程实际上等待为其他进程写入它,创建一个(单向)同步点。其他例子是FIFO和套接字。对于更简单的任务,可以使用wait()系列功能或signals

+0

在这种情况下,不应忽视提及'wait()'函数族。 –

+0

对。我会补充一些。 –

1

当一个进程分叉多次时,父节点是否在子节点之前完成执行?反之亦然?同时? -

同时并取决于调度程序及其不可预知的。

Using pipe to pass integer values between parent and child

此链接详细解释了有关父进程和孩子之间共享数据。 由于您有四个子进程,您可能需要在每个子进程之间创建不同的独立管道。

写入到管道的每个字节的数据都只能被读取一次。它不会复制到每个进程打开管道的读取结束。

Multiple child processes reading/writing on the same pipe

或者你可以尝试在数据传输共享内存。