【问题标题】:Forked processes order of execution分叉的进程执行顺序
【发布时间】:2017-02-06 23:10:04
【问题描述】:

我知道还有另一个同名的帖子,但这实际上是一个不同的问题。

当一个进程多次分叉时,父进程是否在子进程之前完成?反之亦然?并发?

这是一个例子。假设我有一个 for 循环,它将 1 个父进程分成 4 个子进程。在 for 循环结束时,我希望父进程通过管道向子进程提供一些数据。数据写入每个子进程各自的标准输入。

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

【问题讨论】:

  • 当一个进程多次fork时,父进程是否先于子进程执行完毕?反之亦然?同时? - 并发并取决于调度程序及其不可预测的情况。
  • 你可以使用wait函数调用等待子进程完成,然后父进程才会执行
  • 你如何获得子进程的管道?这不是popen() 的设计目的吗? (另外,fork() 返回后,应该存在两个进程,所以此时,无论您在哪个进程中,都应该存在一个完整的子进程,并具有有效的标准输入和标准输出)
  • 为什么你认为孩子会使用无效的标准输入?如果它在父级写入任何内容之前尝试读取管道,它只会等待,不会返回无效数据。
  • 这取决于分叉进程的编写方式。初学者 shell(经常在 SO 上看到——通常从 10 月开始)经常犯错误,即尝试运行管道,以便 shell 等待第一个子进程完成后再启动第二个子进程。一般来说,这很糟糕,尽管他们经常侥幸逃脱,因为孩子写的数据不会超过管道缓冲区的容量。您可以安排孩子在父母完成之前不要做任何事情;您可以安排父母在孩子完成之前不要做任何事情;您可以安排它们全部同时执行,等等。

标签: c fork


【解决方案1】:

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

【讨论】:

  • 在这种情况下,不应忽视提及wait() 系列函数。
  • 对。我再补充一点。
【解决方案2】:

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

并发并取决于调度程序及其不可预测性。

Using pipe to pass integer values between parent and child

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

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

Multiple child processes reading/writing on the same pipe

或者,您可以尝试使用共享内存进行数据传输。

【讨论】:

    【解决方案3】:

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

    研究互斥锁或其他处理并发的方法。

    【讨论】:

      猜你喜欢
      • 2011-07-09
      • 1970-01-01
      • 2011-03-05
      • 2017-01-28
      • 1970-01-01
      • 2021-05-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多