是否需要在调用之前显式刷新输出流abort()
以避免丢失输出?
据我了解,stderr
没有缓冲,所以abort
在输出到stderr
/之后调用cerr
应该没问题。stdout
/cout
或我打开的文件怎么样?
PS。我在 Linux 环境中工作(如果重要的话)。
是的,它是必需的,但不,这可能是不可能的。如果您正在从异步信号上下文中止,则调用会fflush
调用未定义的行为。通常,如果调用的原因abort
是您在程序中检测到不一致的状态,则存在 stdio 状态也被破坏的风险,fflush
因此调用是不安全的。
exit(1)
通常,如果由于程序根本无法处理的情况而终止,则应使用abort()
(without fflush
) 仅在检测到程序已调用未定义的行为时使用,
更多细节:
C 标准允许实现将 stdio 流作为 abort 的一部分刷新 (C11 7.22.4.1:):
是否刷新具有未写入缓冲数据的打开流、关闭打开流或删除临时文件是实现定义的。
但是,这并没有消除abort
从信号处理程序调用时有效的要求。因为,从实际的角度来看,如果从中断了缓冲区处于不一致状态的 stdio 代码的信号处理程序调用通常不可能刷新缓冲区abort
,因此任何尝试使用此允许的实现都可能是错误的。
当前版本的 Linux 手册页abort
错误地指出:
如果 abort() 函数导致进程终止,则所有打开的流都将关闭并刷新。
当前行为的更正确说法是尝试刷新,但可能会失败或损坏您的数据。根据此线程,此错误目前正在 glibc 中修复(也许修复已经提交......?):
http://www.sourceware.org/ml/libc-alpha/2013-05/msg00207.html
标准输出是缓冲的,例如,您使用 ofstream 打开的文件也是如此。您必须使用冲洗操纵器显式冲洗它们