流程组内的流水线操作

时间:2011-10-23 01:16:05

标签: c shell unix process operating-system

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

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

  

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

     

proc1 | proc2& proc3 | proc4 | proc5

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

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

所以,我在进程组中有proc3,proc4,proc5。太棒了。这实际上有助于在它们之间创建管道吗?

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

  1. 创建N-1个管道,其中N是该管道中的进程数 pipelined语句fork()shell进程N次
  2. 在每个分叉进程中,我需要使用dup2来正确设置 共享管道
  3. 然后,在所有分叉进程确认它们之后 已经完成了所有管道的设置(可能通过一些IPC通过 共享内存空间),然后每个可以运行exec()并实际启动 他们各自的过程。
  4. 然而,我所阅读的所有文本都表现为过程组为创建这些管道提供了一些神奇的功能 - 或者他们只是忽略了我上面概述的过程。

    任何意见或建议总是受到赞赏。

1 个答案:

答案 0 :(得分:3)

进程组不会神奇地提供管道。您需要按照描述设置管道(除非您需要在步骤3中进行任何类型的确认 - 每个流程只是开始使用其管道,如果另一端不是设置,它将直接阻止,直到它。)

进程组提供的“神奇”是处理信号和共享终端。