簡體   English   中英

C / C ++:異常終止前刷新輸出

[英]C/C++: Flush output before abnormal termination

是否需要在調用abort()之前顯式刷新輸出流以避免輸出丟失?

據我所知,使用stderr沒有緩沖,所以在輸出到stderr / cerr之后調用abort應該沒問題。 stdout / cout或我打開的文件怎么樣?

PS。 我在Linux環境中工作(如果重要的話)。

是的,它是必需的,但不是,它可能是不可能的。 如果您從異步信號上下文中止,則調用fflush調用未定義的行為。 通常,如果調用abort的原因是您在程序中檢測到不一致狀態,則存在stdio狀態也被破壞的風險,因此調用fflush是不安全的。

通常,如果由於程序無法處理的條件而終止,則應使用exit(1) ,並且只有在檢測到程序已調用未定義的行為時才使用abort() (不使用fflush ),

更多細節:

C標准允許實現刷新stdio流作為中止的一部分(C11 7.22.4.1 :):

是否刷新具有未寫入緩沖數據的開放流,關閉打開流,或者刪除臨時文件是實現定義的。

但是,如果從信號處理程序調用,則不會刪除abort工作的要求。 因為從實際的角度來看,如果從一個信號處理程序調用abort來緩沖緩沖區通常是不可能的,該信號處理程序中斷了緩沖區處於不一致狀態的stdio代碼,任何試圖使用此容差的實現都可能是錯誤的。

用於abort的Linux手冊頁的當前版本錯誤地指出:

如果abort()函數導致進程終止,則關閉並刷新所有打開的流。

對當前行為的更正確的陳述是嘗試刷新但可能會失敗或損壞您的數據。 根據這個帖子,這個bug目前正在glibc中修復(也許修復程序已經提交了??)

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

Stdout是緩沖的,例如你用ofstream打開的文件也是如此。 您必須使用flush操作符顯式刷新它們

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM