gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 19:53:03 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com