web-dev-qa-db-ja.com

stdout stderrのバッファリングを制御するものは何ですか?

プログラムの開始時に、システムのどの部分が3つの標準ストリームのバッファリングを設定しますか?

これはLinuxの一部ですか、それともglibcですか、それともbashですか? POSIXは動作を定義しますか、それともCの一部ですか?

Posixにはいくつかの答えがあります。

https://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html#tag_15_05

プログラムの起動時に、3つのストリームが事前定義されており、明示的に開く必要はありません。標準入力(従来の入力の読み取り用)、標準出力(従来の出力の書き込み用)、および標準エラー(診断出力の書き込み用)です。開いたとき、標準エラーストリームは完全にバッファリングされていません。標準入力ストリームと標準出力ストリームは、ストリームが対話型デバイスを参照していないと判断できる場合にのみ、完全にバッファリングされます。

したがって、システムがストリームがインタラクティブではないと判断できる場合、それらは完全にバッファリングできます(stderrを除く)が、実際には、これはシステムのどの部分を判断しますか?

1
Evan Benn

あなたのプログラミング言語

この動作は、Cランタイムライブラリの成果物であり、Cプログラミング言語の要件です。他のプログラミング言語は、歴史的にCランタイムライブラリの上に構築されており、そこからこの動作を取得します。これは、たとえばC++プログラムにも当てはまります。 CおよびC++言語標準の章と節は、Stack Overflow(q.v。)でかなり頻繁に引用されています。

最も注目すべきは、Pythonで記述されたプログラムは同じ動作をし、かなり頻繁に質問されますが、プログラミング言語ランタイムの動作が大幅に誤って配置されていることが原因である場合もあります。

(プログラムを変更および再コンパイルせずに)デフォルトの言語セマンティクスを使用するプログラムのこの動作を変更するツールには、2つの形式があります。ランタイムに挿入してバッファリングを変更する言語依存(および場合によってはランタイムライブラリ固有)ツール、ランタイムライブラリがインタラクティブデバイスであると判断したファイルに標準I/Oを作成するツール。後者のクラスのツールは言語に依存せず、Bernstein ptybandageが含まれます。

参考文献

バッファリングの質問のほんの数例:

2
JdeBP