【问题标题】:Pipelining within Process Groups流程组内的流水线
【发布时间】:2011-12-13 09:43:56
【问题描述】:

我目前正在阅读 Stevens/Rago 的《Unix 环境中的高级编程》。

在本书的进程组部分,作者讨论了 shell 通常如何利用进程组进行流水线操作。

例如,下面显示的参数可能是由 形式的shell命令:

proc1 | proc2 和 proc3 |进程4 | proc5

许多其他资源也讨论了进程组和流水线之间的关系。但是,我找不到的一件事是解释如何实现流水线部分。

我知道在像 Boune-again shell (BASH) 这样的 posix/unix shell 中,管道中的进程是并行执行的——也就是说,在前面显示 proc3 | proc4 | proc5 的示例中,这三个进程都是同时执行的. proc4 的标准输入连接到 proc3 的标准输入。 (我也知道 MS-DOS 使用临时文件并且没有并行执行管道,但我们暂时忽略它。

所以,我将 proc3、proc4、proc5 全部放在一个进程组中。极好的。这实际上如何帮助创建它们之间的管道?

据我所知,我需要执行以下操作才能在我构建的 shell 中启用流水线:

  1. 创建 N-1 个管道,其中 N 是管道中的进程数 流水线语句 fork() shell 进程 N 次
  2. 在每个分叉的进程中,我需要使用 dup2 正确设置 共享管道
  3. 然后,在所有分叉的进程都确认它们 已经全部完成了他们的管道设置(可能通过一些 IPC 通过 共享内存空间),然后每个都可以运行 exec() 并实际启动 各自的流程。

但是,我一直阅读的所有文本都好像流程组提供了一些神奇的功能来创建这些管道——或者他们只是忽略了提及我上面概述的过程。

我们总是感谢任何 cmets 或建议。

【问题讨论】:

    标签: c shell unix process operating-system


    【解决方案1】:

    进程组不会神奇地提供管道。您确实需要按照您的描述设置管道(除了您不需要在步骤 3 中需要任何类型的确认 - 每个进程刚刚开始使用它的管道,如果另一端不是尚未设置,它会简单地阻塞,直到它被设置为止)。

    进程组提供的“魔力”在于处理信号和共享终端。

    【讨论】:

    • 感谢您提醒我在设置另一端之前将如何阻塞管道——我忽略了这方面。
    猜你喜欢
    • 2014-04-04
    • 1970-01-01
    • 2022-07-14
    • 1970-01-01
    • 2013-04-01
    • 2015-05-07
    • 2011-01-26
    • 2017-02-24
    • 2017-03-24
    相关资源
    最近更新 更多