linux stdbuf - 行缓冲标准输入选项不存在

iru*_*var 6 linux buffer stdin

stdbuf 命令的手册页指出,行缓冲模式作为标准输入缓冲选项无效。这是什么原因?

tail -f access.log | stdbuf -iL cut -d' ' -f1 | uniq

stdbuf: line buffering stdin is meaningless
Try `stdbuf --help' for more information.
Run Code Online (Sandbox Code Playgroud)

Kyl*_*nes 7

简而言之,stdbuf 是 stdio 功能的包装器。输入流的行缓冲在 stdio 中未定义;我找不到任何标准文件说明它的含义,因此就标准而言,它实际上毫无意义。

假设行为类似于 stdout 行缓冲,stdin 的行缓冲需要为每个字符读取调用一次 read(),因为没有其他方法可以保证您不会读取描述符上的换行符。由于缓冲的目的是减少系统调用的数量,因此 stdio 库没有实现这一点也就不足为奇了。


小智 7

作为 stdbuf 的作者,让我将您引导至http://www.pixelbeat.org/programming/stdio_buffering/上的“stdio 输入缓冲问题”部分

  • 您正在考虑的输入行缓冲发生在内核中,特别是在 tty 驱动程序中,而不是在终端上运行的程序中,因此要控制它,您不需要 `stdbuf`,只需要 `stty`。C 库中没有输入的行缓冲。另外我认为你的 tail|cut|uniq 管道中真正需要的是 `tail` 和 `cut` 上的行缓冲输出。 (5认同)