`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また、バッファリングされたC stdio関数(、、、、)の代わりに、およびシステムコールを直接cat使用するため、stdioへの変更は影響しません。read(2)write(2)fread(3)fwrite(3)printf(3)

stdbuf(1)デフォルトでは、プログラムが使用するバッファリング戦略ではなく、ユーザーが必要とするバッファリング戦略を使用するためにstdioの一部の機能をオーバーライドする小さな動的ライブラリ(MacLD_PRELOADまたはで使用)をプリロードして動作します。DYLD_INSERT_LIBRARIES

答え2

stdbuf手動もっと明確に言えば:

注文するプログラム名で始める必要があります。

  1. 入力/出力にISO CFILEストリームを使用します(プログラムを参照してくださいddcatそうしないでください)。
  2. 標準ストリームのバッファリングを調整しません(このプログラムはteeこのカテゴリに属しません)。

ISO CFILEストリームは、次から返されるものと同じストリームです。fopen、相対的open。標準入力、出力、および/またはエラーを中心にCライブラリのラップされたストリームを調整するライブラリをstdbufプリロードして動作します。これらのストリームを使用しないプログラムは影響を受けません。たとえば、GNUはlibstdbufFILEcat標準入力ファイル記述子、または次によって返されるファイル記述子open

関連情報