Linux 管道行为
Linux piping behaviour
好的,这只是为了满足我和其他可能有类似问题的人的好奇心。请忍受无知和冗长的问题,因为它部分是 "i dont know what i dont know".
的情况
第 1 部分
假设 fileToFollow.txt 有一些任意内容。
row1
row2
row3
执行 tail fileToFollow.txt | cat
会产生预期的文件内容。
执行tail -f fileToFollow.txt | cat
将继续输出写入fileToFollow.txt
的任何内容
我想象管道是获取一个程序的输出并将其馈送到另一个程序的输入(例如,如果 cat 是一个 C 程序,它将能够通过 main() 参数访问该输入)。
问题 1:这是怎么回事,每次 tail 有输出时都调用 cat 吗?
第 2 部分
我决定将 grep
加入组合设置如下:
tail -f fileToFollow.txt | grep "whatever" | cat
显然这里不需要 cat,因为 grep 本身无论如何都会输出到终端。但是考虑到管道是从一个程序输出到另一个程序的输入的想法,我假设它会。但是,在这种情况下,终端中不会显示任何输出。
以下当然可以正常工作:
tail -f fileToFollow.txt | grep "whatever"
我有一种预感,我对管道的实际工作方式以及为什么我介绍的案例没有像我期望的那样表现有点困惑。
欢迎任何形式的启蒙。非常感谢您抽出宝贵时间。
当你输入一个程序时,源的标准输出通常会切换到缓冲模式(参见man setvbuf()
),这意味着必须生成一定量的数据(2KiB 或 4KiB 左右)在将其提供给 write(2)
.
之前
将其发送给 tty 使用行缓冲模式,以便在 \n
之后刷新缓冲区。
存在一个 stdbuf
工具来修改此行为。
问题 1 的答案:不,cat 一直是 运行 作为一个进程,但是当没有任何可用内容时它会阻止读取 stdin。当管道(尾部)中它之前的进程将新字节写入管道时,读取调用将 return 并且 cat 能够处理新数据。之后它将再次读取并阻塞,直到有新数据可用。
好的,这只是为了满足我和其他可能有类似问题的人的好奇心。请忍受无知和冗长的问题,因为它部分是 "i dont know what i dont know".
的情况第 1 部分
假设 fileToFollow.txt 有一些任意内容。
row1
row2
row3
执行 tail fileToFollow.txt | cat
会产生预期的文件内容。
执行tail -f fileToFollow.txt | cat
将继续输出写入fileToFollow.txt
的任何内容
我想象管道是获取一个程序的输出并将其馈送到另一个程序的输入(例如,如果 cat 是一个 C 程序,它将能够通过 main() 参数访问该输入)。
问题 1:这是怎么回事,每次 tail 有输出时都调用 cat 吗?
第 2 部分
我决定将 grep
加入组合设置如下:
tail -f fileToFollow.txt | grep "whatever" | cat
显然这里不需要 cat,因为 grep 本身无论如何都会输出到终端。但是考虑到管道是从一个程序输出到另一个程序的输入的想法,我假设它会。但是,在这种情况下,终端中不会显示任何输出。
以下当然可以正常工作:
tail -f fileToFollow.txt | grep "whatever"
我有一种预感,我对管道的实际工作方式以及为什么我介绍的案例没有像我期望的那样表现有点困惑。
欢迎任何形式的启蒙。非常感谢您抽出宝贵时间。
当你输入一个程序时,源的标准输出通常会切换到缓冲模式(参见man setvbuf()
),这意味着必须生成一定量的数据(2KiB 或 4KiB 左右)在将其提供给 write(2)
.
将其发送给 tty 使用行缓冲模式,以便在 \n
之后刷新缓冲区。
存在一个 stdbuf
工具来修改此行为。
问题 1 的答案:不,cat 一直是 运行 作为一个进程,但是当没有任何可用内容时它会阻止读取 stdin。当管道(尾部)中它之前的进程将新字节写入管道时,读取调用将 return 并且 cat 能够处理新数据。之后它将再次读取并阻塞,直到有新数据可用。