了解管道:读取行和执行顺序

时间:2015-04-20 10:09:18

标签: macos bash pipe

说我运行命令

decode_input < input.txt | intermediate_calcs | decode_output > output.txt

其中每个程序从stdin读取一行输入,并在stdout上输出一行。

操作系统如何运行/管理所有这些操作?

1)decode_input首先运行并从input.txt读取N行,然后所有输出都通过管道传输到intermediate_calcs,它读取并处理N行,最后通过管道传递给{ {1}}?

OR: 2)decode_output是否从decode_input读取一行行,处理它,将其输出通过管道传输到input.txt,再次管道其一行输出到intermediate_calcs的行,然后第一行输出写入decode_output。 然后对output.txt

中的N行重复此过程

因此,如果进程是串行进行的,如2),如果其中一个中间步骤比另一个慢得多,这可能会非常慢?例如。如果input.txt花费的时间最多,则其他2个流程必须等待decode_inputdecode_input

中的每一行生成输入

谢谢

2 个答案:

答案 0 :(得分:1)

按照2)。但这实际上取决于每个流程的编写方式。通常,该过程将使用某种getline()方法,它将有效阻止,直到它收到一行输入值。但是,可以使用非阻塞I / O或多个线程来编写进程,这些线程将处理输入的每个字符并生成适当的输出。

因此,根本不是O / S问题。

答案 1 :(得分:1)

管道中的所有命令都是同时启动的。 shell使用pipe()fork()系统调用来相应地设置文件描述符和未命名的管道,以便每个进程可以从stdin读取并写入stdout

就像你假设的那样,管道只能和最慢的流程一样快,所以在你的例子中,如果decode_input很慢,其他两个进程将花费很多时间等待输入。

但这不是一件坏事:如果正确实施,几乎不会花费任何CPU时间。