web-dev-qa-db-ja.com

Cのバッファーのフラッシュ

fflush()は、出力ストリームであっても、バッファのフラッシュに使用すべきではありませんか?

それは何に役立ちますか?一般にバッファをフラッシュするにはどうすればよいですか?

52
saadtaame

出力バッファーのフラッシュ:

printf("Buffered, will be flushed");
fflush(stdout); // Prints to screen or whatever your standard out is

または

fprintf(fd, "Buffered, will be flushed");
fflush(fd);  //Prints to a file

非常に役立つテクニックになります。なぜ出力バッファをフラッシュしたいのですか?通常、私がそれをするとき、それはコードがクラッシュしていて、何かをデバッグしようとしているからです。標準バッファは、printf()を呼び出すたびに出力するわけではなく、一杯になるまで待機してから、一度に大量のダンプを行います。したがって、クラッシュする前に関数呼び出しを行っているかどうかを確認しようとする場合、「[ここにいる!」のようなprintfが役立ちます。また、クラッシュする前にバッファーがフラッシュされないことがあります。起こって、あなたは本当にあなたがどれほど遠くまで行ったかわかりません。

役立つもう1つの機会は、マルチプロセスまたはマルチスレッドコードです。繰り返しますが、バッファはprintf()の呼び出しで常にフラッシュするわけではありません。そのため、複数のプロセスの実際の実行順序を知りたい場合は、印刷のたびにバッファをフラッシュする必要があります。

私はそれをする習慣を作ります。それにより、デバッグの頭痛の種がかなり減ります。そうすることで考えられる唯一の欠点は、printf()が高価な操作であるということです(そのため、デフォルトではバッファーをフラッシュしません)。


入力バッファ(stdin)をフラッシュする限り、それを行うべきではありません。フラッシングstdinは、C11標準の§7.21.5.2パート2による未定義の動作です。

ストリームが出力ストリームを指している場合... fflush関数により、そのストリームの未書き込みデータがファイルに書き込まれます。それ以外の場合、動作は未定義です。

fflush() のmanページで見ることができるように、一部のシステムではLinuxが1つであるため、動作は定義されていますが、システムに依存しているためコードは移植できません。

入力バッファでゴミが「スタック」することが心配な場合は、fpurge()を使用できます。 fflush()およびfpurge()の詳細については、 here を参照してください

88
Mike