3

abort()出力の損失を避けるために、呼び出す前に明示的に出力ストリームをフラッシュする必要がありますか?

私が理解しているように、バッファリングがないため、 /への出力後にstderr呼び出しても問題ありません。/ 、または私が開いているファイルはどうですか?abortstderrcerrstdoutcout

PS。Linux環境で作業しています(問題がある場合)。

4

2 に答える 2

11

はい、必要ですが、できません。async-signal コンテキストから中止する場合、呼び出しfflushによって未定義の動作が呼び出されます。また、一般に、呼び出しの理由がabortプログラム内で一貫性のない状態を検出した場合、stdio の状態も壊れている可能性があり、その呼び出しfflushは安全ではありません。

一般に、exit(1)プログラムが単に処理できない状態のために終了している場合は を使用し、プログラムが未定義の動作を既に呼び出していることを検出した場合にのみabort()( を使用せずに) を使用する必要があります。fflush

詳細:

C 標準では、実装が中断の一部として stdio ストリームをフラッシュできます (C11 7.22.4.1:):

バッファリングされたデータが書き込まれていない開いているストリームをフラッシュするか、開いているストリームを閉じるか、または一時ファイルを削除するかは、実装によって定義されます。

abortただし、これは、シグナル ハンドラーから呼び出された場合に機能するという要件を取り除くものではありません。実用的な観点から、バッファが矛盾した状態にある stdio コードを中断したシグナルハンドラから呼び出された場合、バッファをフラッシュすることは通常不可能であるためabort、この許可を使用しようとする実装はバグがある可能性があります。

Linux のマニュアル ページの現在のバージョンには、abort誤って次のように記載されています。

abort() 関数によってプロセスが終了した場合、開いているすべてのストリームが閉じられ、フラッシュされます。

現在の動作をより正確に説明すると、フラッシュが試行されますが、失敗するか、データが破損する可能性があります。このバグは現在、このスレッドによると、glibc で修正中です (修正は既にコミットされている可能性があります...?)。

http://www.sourceware.org/ml/libc-alpha/2013-05/msg00207.html

于 2013-08-19T15:38:50.307 に答える
0

Stdout はバッファリングされ、たとえば ofstream で開くファイルもバッファリングされます。フラッシュマニピュレータを使用して明示的にフラッシュする必要があります

于 2013-08-19T15:31:57.323 に答える