是否需要在调用 abort()
之前显式刷新输出流以避免输出丢失?
据我了解,stderr
没有缓冲,因此在输出到 stderr
/cerr
后调用 abort
> 应该没问题。 stdout
/cout
或我打开的文件怎么样?
附言。我在 Linux 环境中工作(如果重要的话)。
最佳答案
是的,它是必需的,但不,它可能是不可能的。如果您要从异步信号上下文中止,则调用 fflush
会调用未定义的行为。通常,如果调用 abort
的原因是您在程序中检测到不一致的状态,则存在 stdio 状态也被破坏的风险,并且调用 fflush
因此是不安全的。
一般来说,如果您由于程序无法处理的情况而终止,您应该使用 exit(1)
,并使用 abort()
(没有 fflush
)只有当你检测到你的程序已经调用了未定义的行为时,
更多细节:
C 标准允许作为中止的一部分刷新 stdio 流的实现 (C11 7.22.4.1:):
Whether open streams with unwritten buffered data are flushed, open streams are closed, or temporary files are removed is implementation-defined.
但是,这并没有消除从信号处理程序调用时 abort
工作的要求。因为,从实际的角度来看,如果 abort
是从中断了缓冲区处于不一致状态的 stdio 代码的信号处理程序调用的,那么通常不可能刷新缓冲区,因此任何尝试使用此允许的实现很可能是 buggy 。
abort
的 Linux 手册页的当前版本错误地指出:
If the abort() function causes process termination, all open streams are closed and flushed.
对当前行为更正确的说法是刷新是尝试但可能会失败或损坏您的数据。这个错误目前正在 glibc 中修复(也许修复已经提交......?)根据这个线程:
http://www.sourceware.org/ml/libc-alpha/2013-05/msg00207.html
关于c++ - C/C++ : Flush output before abnormal termination,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18317564/