abort()
出力の損失を避けるために、呼び出す前に明示的に出力ストリームをフラッシュする必要がありますか?
私が理解しているように、バッファリングがないため、 /への出力後にstderr
呼び出しても問題ありません。/ 、または私が開いているファイルはどうですか?abort
stderr
cerr
stdout
cout
PS。Linux環境で作業しています(問題がある場合)。
はい、必要ですが、できません。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
Stdout はバッファリングされ、たとえば ofstream で開くファイルもバッファリングされます。フラッシュマニピュレータを使用して明示的にフラッシュする必要があります