【发布时间】:2017-02-06 23:10:04
【问题描述】:
我知道还有另一个同名的帖子,但这实际上是一个不同的问题。
当一个进程多次分叉时,父进程是否在子进程之前完成?反之亦然?并发?
这是一个例子。假设我有一个 for 循环,它将 1 个父进程分成 4 个子进程。在 for 循环结束时,我希望父进程通过管道向子进程提供一些数据。数据写入每个子进程各自的标准输入。
在任何孩子执行他们的代码之前,父母会先发送数据吗?这很重要,因为我们不希望它从无效的标准输入开始工作。
【问题讨论】:
-
当一个进程多次fork时,父进程是否先于子进程执行完毕?反之亦然?同时? - 并发并取决于调度程序及其不可预测的情况。
-
你可以使用wait函数调用等待子进程完成,然后父进程才会执行
-
你如何获得子进程的管道?这不是
popen()的设计目的吗? (另外,fork()返回后,应该存在两个进程,所以此时,无论您在哪个进程中,都应该存在一个完整的子进程,并具有有效的标准输入和标准输出) -
为什么你认为孩子会使用无效的标准输入?如果它在父级写入任何内容之前尝试读取管道,它只会等待,不会返回无效数据。
-
这取决于分叉进程的编写方式。初学者 shell(经常在 SO 上看到——通常从 10 月开始)经常犯错误,即尝试运行管道,以便 shell 等待第一个子进程完成后再启动第二个子进程。一般来说,这很糟糕,尽管他们经常侥幸逃脱,因为孩子写的数据不会超过管道缓冲区的容量。您可以安排孩子在父母完成之前不要做任何事情;您可以安排父母在孩子完成之前不要做任何事情;您可以安排它们全部同时执行,等等。