Text-Processing

cat 的 I/O 模型與其他實用程序有何不同?

  • September 25, 2018

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 流,那麼它使用什麼?相關的手冊頁和網路搜尋未能提供進一步的見解。

stdbuf手冊稍微更明確:

命令必須以一個程序的名稱開始

  1. 使用 ISO CFILE流進行輸入/輸出(注意程序ddcat不要這樣做),
  2. 不調整其標準流的緩衝(注意該程序tee不在此類別中)。

ISO CFILE流是諸如返回的流fopen,而不是open. stdbuf通過預載入一個libstdbuf庫來調整FILEC 庫圍繞標準輸入、輸出和/或錯誤包裝的流;不使用這些流的程序不受影響。cat例如, GNU使用其標準輸入文件描述符,或由open.

dd並直接cat使用read(2)andwrite(2)系統呼叫,而不是緩衝的 C stdio 函式 ( fread(3), fwrite(3), printf(3)),因此對 stdio 的任何更改都不會影響它們。

stdbuf(1)通過預載入一個小型動態庫(使用LD_PRELOADDYLD_INSERT_LIBRARIES在 Mac 上)來工作,該庫覆蓋 stdio 中的一些函式,以便使用使用者所需的緩衝策略,而不是程序預設使用的緩衝策略。

引用自:https://unix.stackexchange.com/questions/471352