是否需要在调用abort()
之前显式刷新输出流以避免输出丢失?
据我了解,stderr
没有缓冲,因此在输出到abort
/ stderr
后调用cerr
应该没问题。 stdout
/ cout
或我打开的文件怎么样?
PS。我在Linux环境中工作(如果重要的话)。
答案 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操作符
显式刷新它们