3

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

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

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

4

2 回答 2

11

是的,它是必需的,但不,这可能是不可能的。如果您正在从异步信号上下文中止,则调用会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

于 2013-08-19T15:38:50.307 回答
0

标准输出是缓冲的,例如,您使用 ofstream 打开的文件也是如此。您必须使用冲洗操纵器显式冲洗它们

于 2013-08-19T15:31:57.323 回答