Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 理解管道:读取行和执行顺序_Macos_Bash_Pipe - Fatal编程技术网

Macos 理解管道:读取行和执行顺序

Macos 理解管道:读取行和执行顺序,macos,bash,pipe,Macos,Bash,Pipe,假设我运行命令 decode_input < input.txt | intermediate_calcs | decode_output > output.txt decode_inputoutput.txt 其中每个程序从stdin读取一行输入,并在stdout上输出一行 操作系统如何运行/管理所有这些操作 1) decode\u input是否首先运行并读取input.txt中的N行,然后所有输出都通过管道传输到中间计算,中间计算读取并处理N行,最后通过管道传输到decod

假设我运行命令

decode_input < input.txt | intermediate_calcs | decode_output > output.txt
decode_inputoutput.txt
其中每个程序从stdin读取一行输入,并在stdout上输出一行

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

1)
decode\u input
是否首先运行并读取
input.txt
中的N行,然后所有输出都通过管道传输到
中间计算
,中间计算读取并处理N行,最后通过管道传输到
decode\u输出

或: 2)
decode\u-input
是否从
input.txt
读取一行,对其进行处理,将其输出输送到
中间计算
,中间计算再次将其一行输出输送到
decode\u-output
,然后将第一行输出写入
output.txt
。 然后对
input.txt
中的N行重复此过程

因此,如果过程以串行方式进行,如图2),如果中间步骤中的一个比另一个慢得多,这可能会非常慢?例如,如果
decode\u input
花费的时间最多,那么其他两个进程必须等待
decode\u input
input.txt?
中的每一行生成输入

谢谢

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


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

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

正如您所假设的,管道的速度只能与其最慢的进程一样快,因此在您的示例中,如果
decode\u input
很慢,那么其他两个进程将花费大量时间等待输入


但这并不是一件坏事:如果实现正确,几乎不需要CPU时间。

它们并行运行。证明:
tail-f文件| grep一些_文本
。在tail完成之前,grep已经开始工作。如果
解码输入
很慢,其他进程怎么能不等待它呢?其他进程将在
解码输入
输出可用时立即消耗它。例如:如果它们是逐行工作的,
解码输入
一打印出一行,
中间计算
就会开始读取这些行并自己产生一些输出。你说正确实现是什么意思?你是说我应该如何实现每个单独的程序(解码输入等)还是应该如何发出管道命令?Thanks@luffe当前位置不,这句话更具学术性。几乎所有的程序都是“正确”执行的。我的意思是:一种简单的方法是定期检查循环()中的I/O缓冲区,这将消耗CPU时间。因此,操作系统和大多数编程框架都提供了阻塞
read()
操作,这些操作将暂停线程或进程,直到I/O可用为止,因此就是这样做的。