c++ - C/C++ : Flush output before abnormal termination

标签 c++ c io abort

是否需要在调用 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/

相关文章:

c++ - 在 RAM 中高效存储 DNA 碱基对数据?

c++ - 优化我的 read() 循环 C(两个循环合二为一)

java - 使用单个流读取目录中的所有目标文件

asynchronous - F# Async.FromBeginEnd 不应该调用 End 函数?

python - 如何在不使用 csv 模块的情况下提取 csv 文件的内容并将其放入 dict 文件类型中。 [Python]

c++ - 未在 C++ Release模式下编写内存转储

c# - float 问题 : C++ to C# migration

c++ - 静态全局函数的静态局部成员?

c - 链表内存问题

c - 为什么我的 C 函数无法处理标点符号?