C / C ++:异常终止前刷新输出

时间:2013-08-19 15:29:14

标签: c++ c io abort

是否需要在调用abort()之前显式刷新输出流以避免输出丢失?

据我了解,stderr没有缓冲,因此在输出到abort / stderr后调用cerr应该没问题。 stdout / cout或我打开的文件怎么样?

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

2 个答案:

答案 0 :(得分:10)

是的,这是必要的,但不是,它可能是不可能的。如果从异步信号上下文中止,则调用fflush将调用未定义的行为。通常,如果调用abort的原因是您在程序中检测到不一致状态,则存在stdio状态也已损坏的风险,因此调用fflush是不安全的。

一般情况下,如果由于程序根本无法处理的情况而终止,则应使用exit(1),并且仅当您使用时abort()(不使用fflush)检测到您的程序已经调用了未定义的行为,

更多细节:

C标准允许一个实现来刷新stdio流作为中止的一部分(C11 7.22.4.1 :):

  

是否刷新具有未写入缓冲数据的开放流,关闭打开流,或者删除临时文件是实现定义的。

但是,如果从信号处理程序调用{​​{1}},则不会删除abort的工作要求。从实际的角度来看,如果从一个信号处理程序调用{​​{1}}来缓冲缓冲区通常是不可能的,该信号处理程序中断了缓冲区处于不一致状态的stdio代码,任何试图使用此容差的实现都可能马车。

abort的Linux手册页的当前版本错误地指出:

  

如果abort()函数导致进程终止,则关闭并刷新所有打开的流。

当前行为的更正确的陈述是刷新尝试但可能会失败或损坏您的数据。根据这个帖子,这个bug目前正在glibc中修复(也许修复程序已经提交了??):

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

答案 1 :(得分:0)

Stdout是缓冲的,例如你用ofstream打开的文件也是如此。您必须使用flush操作符

显式刷新它们