pipe道如何在Linux中工作?

pipe道如何工作? 如果我通过CLI运行一个程序,并将输出redirect到一个文件,我将能够将该文件传送到另一个正在写入的程序中?

基本上,当一行写入文件,我希望它立即pipe道到我的第二个应用程序(我试图dynamic绘制一个现有的程序图)。 只是不确定pipe道是否完成第一个命令,然后再转到下一个命令。

任何反馈将不胜感激!

Solutions Collecting From Web of "pipe道如何在Linux中工作?"

如果您想将一个程序的输出重定向到另一个程序的输入,只需使用一个简单的管道:

program1 arg arg | program2 arg arg 

如果要将program1的输出保存到文件中并将其传送到program2 ,可以使用tee(1)

 program1 arg arg | tee output-file | program2 arg arg 

管道中的所有程序都是同时运行的。 大多数程序通常使用阻塞 I / O:如果当他们尝试读取输入并且没有任何东西存在时,它们将被阻塞 :即停止,操作系统取消调度它们直到有更多的输入可用(避免进食在CPU上)。 同样,如果一个程序中的程序在写入数据的速度比后面的程序读取数据的速度快,那么最终管道的缓冲区将会填满,写入程序会阻塞:操作系统将取消调度,直到管道的缓冲区被读取器清空,然后它可以继续写。


编辑

如果要使用program1的输出作为命令行参数,则可以使用反引号或$()语法:

 # Runs "program1 arg", and uses the output as the command-line arguments for # program2 program2 `program1 arg` # Same as above program2 $(program1 arg) 

$()语法应该是首选的,因为它们更清晰,可以嵌套。

在运行第二个命令之前,管道没有完成第一个命令 。 Unix(和Linux)管道同时运行所有命令。 如果命令将被暂停

  • 它是饿死的输入。

  • 它已经产生了比继任者准备消费更多的产出。

对于大多数程序来说,输出是被缓冲的 ,这意味着操作系统在将其传递到管道的下一个阶段之前会累积大量的输出(大约8000个字符)。 这个缓冲用来避免在进程和内核之间来回切换。

如果你希望立即发送一个管道上的输出,你可以使用非缓冲 I / O,在C中这意味着调用类似fflush()方法来确保任何缓冲的输出立即发送到下一个进程。 无缓冲的输入也是可能的,但是通常是不必要的,因为输入不足的进程通常不会等待完整的缓冲区,而是会处理任何可以得到的输入。

对于典型应用,不建议使用无缓冲输出; 您通常会使用默认值获得最佳性能。 但是,在你的情况下,你想立即做动态图形的第一个进程有信息可用,你一定要使用无缓冲的输出。 如果你使用C,只要你想要输出发送就足够了,就调用fflush(stdout)

如果您的程序使用stdinstdout进行通信,那么请确保您在写入之后调用fflush(stdout) ,或者找到一些方法来禁用标准IO缓冲。 我能想到的最好的参考是真正描述了如何在C / C ++中最好地实现管道,这是UNIX环境或UNIX网络编程 中的高级 编程:第2卷 。 你也可以从这篇文章开始。

如果你的两个程序坚持读写文件而不使用stdin / stdout,你可能会发现你可以使用命名管道而不是文件。

使用mknod(1)命令创建一个命名管道:

 $ mknod /tmp/named-pipe p 

然后配置你的程序来读/写/ tmp / named-pipe(使用你认为合适的路径/名称)。

在这种情况下,两个程序将并行运行,当管道满/空时,根据需要进行阻塞,如其他答案中所述。