Text-Processing
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 流,那麼它使用什麼?相關的手冊頁和網路搜尋未能提供進一步的見解。
該
stdbuf
手冊稍微更明確:命令必須以一個程序的名稱開始
- 使用 ISO C
FILE
流進行輸入/輸出(注意程序dd
,cat
不要這樣做),- 不調整其標準流的緩衝(注意該程序
tee
不在此類別中)。ISO C
FILE
流是諸如返回的流fopen
,而不是open
.stdbuf
通過預載入一個libstdbuf
庫來調整FILE
C 庫圍繞標準輸入、輸出和/或錯誤包裝的流;不使用這些流的程序不受影響。cat
例如, GNU使用其標準輸入文件描述符,或由open
.
dd
並直接cat
使用read(2)
andwrite(2)
系統呼叫,而不是緩衝的 C stdio 函式 (fread(3)
,fwrite(3)
,printf(3)
),因此對 stdio 的任何更改都不會影響它們。
stdbuf(1)
通過預載入一個小型動態庫(使用LD_PRELOAD
或DYLD_INSERT_LIBRARIES
在 Mac 上)來工作,該庫覆蓋 stdio 中的一些函式,以便使用使用者所需的緩衝策略,而不是程序預設使用的緩衝策略。