在这种情况下,stdio 缓冲区如何工作?
How does stdio buffer works in this case?
我一直在研究 stdio 缓冲的工作原理。我看了下面的链接[1]和[2],但有两点我还是不明白。
在 [2] 中,他使用以下 bash 脚本间歇性地写入输出,然后使用管道命令:
#generator.bash
for i in {1..1000}; do
echo "this is line $i"
sleep 1
done
bash generator.bash | grep --line-buffered line | cut -c 9-
我理解他为什么必须将 --line-buffered 与 grep 一起使用,但为什么他不必对来自“bash generator.bash”的标准输出缓冲区做类似的事情?我只能想象这个 stdout 缓冲区是行缓冲的,但我找不到任何东西来证实这一点。
另外,grep 和 cut line 的标准输入缓冲区是否也被缓冲了?我找不到任何东西来确认这是否属实,但如果它不是行缓冲的,那么如果另一侧的标准输入是块缓冲的,那么使标准输出缓冲行缓冲有什么意义?
[1] https://www.pixelbeat.org/programming/stdio_buffering/
[2]https://blog.jpalardy.com/posts/grep-and-output-buffering/
缓冲只是将数据附加到内存中的字节字符串,以便您可以在单个 write()
系统调用中合并多个逻辑写入以提高效率。由于分配的内存通常是按进程分配的,因此程序在退出之前需要刷新其缓冲区,否则数据将丢失。
因此,您必然无法缓冲多个 /bin/echo
调用的输出。
(如今 echo
通常内置于 shell 中,但它遵循相同的语义。)
我一直在研究 stdio 缓冲的工作原理。我看了下面的链接[1]和[2],但有两点我还是不明白。
在 [2] 中,他使用以下 bash 脚本间歇性地写入输出,然后使用管道命令:
#generator.bash
for i in {1..1000}; do
echo "this is line $i"
sleep 1
done
bash generator.bash | grep --line-buffered line | cut -c 9-
我理解他为什么必须将 --line-buffered 与 grep 一起使用,但为什么他不必对来自“bash generator.bash”的标准输出缓冲区做类似的事情?我只能想象这个 stdout 缓冲区是行缓冲的,但我找不到任何东西来证实这一点。
另外,grep 和 cut line 的标准输入缓冲区是否也被缓冲了?我找不到任何东西来确认这是否属实,但如果它不是行缓冲的,那么如果另一侧的标准输入是块缓冲的,那么使标准输出缓冲行缓冲有什么意义?
[1] https://www.pixelbeat.org/programming/stdio_buffering/
[2]https://blog.jpalardy.com/posts/grep-and-output-buffering/
缓冲只是将数据附加到内存中的字节字符串,以便您可以在单个 write()
系统调用中合并多个逻辑写入以提高效率。由于分配的内存通常是按进程分配的,因此程序在退出之前需要刷新其缓冲区,否则数据将丢失。
因此,您必然无法缓冲多个 /bin/echo
调用的输出。
(如今 echo
通常内置于 shell 中,但它遵循相同的语义。)