stdbuf --help
从(GNU)的输出来看:
Usage: stdbuf OPTION... COMMAND
Run COMMAND, with modified buffering operations for its standard streams.
...
NOTE: If COMMAND adjusts the buffering of its standard streams ('tee' does
for example) then that will override corresponding changes by 'stdbuf'.
Also some filters (like 'dd' and 'cat' etc.) don't use streams for I/O,
and are thus unaffected by 'stdbuf' settings.
我对这种情况下“I/O 流”的精确定义是什么以及它cat
具体如何应用感到困惑。如果它不使用标准 I/O 流,那么它使用什么?相关的手册页和网络搜索未能提供进一步的见解。
答案1
dd
并直接cat
使用read(2)
和write(2)
系统调用,而不是缓冲的 C stdio 函数(fread(3)
, fwrite(3)
, printf(3)
),因此对 stdio 的任何更改都不会影响它们。
stdbuf(1)
通过预加载一个小型动态库(在 Mac 上使用LD_PRELOAD
或DYLD_INSERT_LIBRARIES
)来工作,该库覆盖 stdio 中的一些函数,以便使用用户所需的缓冲策略,而不是程序默认使用的缓冲策略。
答案2
手册stdbuf
稍微更明确一点:
命令必须以程序名称开头
- 使用 ISO C
FILE
流进行输入/输出(注意程序dd
,cat
不要这样做),- 不调整其标准流的缓冲(请注意该程序
tee
不属于此类别的)。
ISO CFILE
流是诸如以下返回的流fopen
,相对于open
。stdbuf
通过预加载一个libstdbuf
库来工作,该库调整FILE
C 库围绕标准输入、输出和/或错误包装的流;不使用这些流的程序不受影响。 GNUcat
例如使用其标准输入文件描述符,或由返回的文件描述符open
。