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
手動もっと明確に言えば:
注文するプログラム名で始める必要があります。
- 入力/出力にISO C
FILE
ストリームを使用します(プログラムを参照してくださいdd
。cat
そうしないでください)。- 標準ストリームのバッファリングを調整しません(このプログラムは
tee
このカテゴリに属しません)。
ISO CFILE
ストリームは、次から返されるものと同じストリームです。fopen
、相対的open
。標準入力、出力、および/またはエラーを中心にCライブラリのラップされたストリームを調整するライブラリをstdbuf
プリロードして動作します。これらのストリームを使用しないプログラムは影響を受けません。たとえば、GNUはlibstdbuf
FILE
cat
標準入力ファイル記述子、または次によって返されるファイル記述子open
。