`cat` 的 I/O 模型与其他实用程序有何不同?

`cat` 的 I/O 模型与其他实用程序有何不同?

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_PRELOADDYLD_INSERT_LIBRARIES)来工作,该库覆盖 stdio 中的一些函数,以便使用用户所需的缓冲策略,而不是程序默认使用的缓冲策略。

答案2

手册stdbuf稍微更明确一点:

命令必须以程序名称开头

  1. 使用 ISO CFILE流进行输入/输出(注意程序ddcat不要这样做),
  2. 不调整其标准流的缓冲(请注意该程序tee不属于此类别的)。

ISO CFILE流是诸如以下返回的流fopen,相对于openstdbuf通过预加载一个libstdbuf库来工作,该库调整FILEC 库围绕标准输入、输出和/或错误包装的流;不使用这些流的程序不受影响。 GNUcat例如使用其标准输入文件描述符,或由返回的文件描述符open

相关内容