- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
是否需要在调用 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/
我尝试了以下两种情况: void ssss(int b){ System.out.println ("int"+b); } void ssss(double b){ System.out.
以下代码是我在 c 中定义的用户函数的一部分 void genprime(long int m,long int n) { long int j,k,p[10000]={0},c,c1,c2,r;
所以我希望这些 div 表现得像 block 一样,只是像漂亮的小元素一样相互堆叠……唉,事实并非如此。我以前遇到过这个问题并设法解决了它......但我不知道如何解决它,因为它再次发生了。 当我在
程序编号 1:在给定的 a 和 b 范围内,其中 a #include #include #include using namespace std; float squaredroot(int
我尝试使用来自 https://github.com/twitter/AnomalyDetection 的 library(AnomalyDetection) 的 AnomalyDetectionTs
以下代码是在二维数组中将 1 视为岛屿,将 0 视为水来查找岛屿的数量。相邻的1属于同一个岛,岛可以是任意形状。这意味着 1 0 1 0 1 0 1 0 1 应将岛数指定为 1。此代码运行并打印 2
我的生产查询遇到了奇怪的 I/O 命中,我无法弄清楚问题出在哪里。我的意思是,这是一个简单的查询,没有任何大规模连接或类似的东西...... 我的表有大约 300K 行,并且每天增长 15/20K 行
当我们执行以下命令时,即使我在 Tshark 捕获中具有相应的值,我也会收到以下错误。 % tshark -r /root/capture.enc -R "icmpv6.option.type ==
我有一个 ASP.Net Core Wep API 项目,它执行以下任务: 通过名为 ProcessController 的 Controller 接收请求。 接收传入请求并将数据格式化为字符串。 使
...有点。正如这个极其简单的示例所示, 非常罕见(到目前为止只有一次报告),我的一个应用程序碰巧以这种方式崩溃。当发生非特定异常时,我想像往常一样终止它。我的策略是(低级别)记录问题,然后终止。该应
我在 tcl 中运行这段代码:- set version [exec grep "INTERNAL VERSION:" mojave.log | sed -n -e "s/INTERNAL VERSI
egrep 命令有问题。 当我在 tcsh 中执行我的命令时,它运行良好,但是当我从 tcl 脚本或 tclsh 中执行它时,我得到: 子进程异常退出 我的 tcl 代码: exec egrep -i
我刚刚安装了 IntelliJ,我正在尝试构建一个 Scala 项目。但是,每次我这样做时,都会收到此错误消息: Information:6/7/16, 12:14 PM - Compilation
当我使用 chromedriver 使用 Selenium 运行测试时出现此错误。 selenium.common.exceptions.WebDriverException: Message: un
你好,我想为左侧栏和侧边栏设置全高,我必须是 100% 高度,但它让我的 css 看起来有点问题 html{ height: 100%; min-height: 100%; } b
我应该如何摆脱这个警告并为 pitest 添加超时常量? 我的命令是: mvn jacoco:report org.pitest:pitest-maven:mutationCoverage sonar
Ubuntu - Ubuntu 中的 Jenkins 和 GIT,使用selenium的Java项目 尝试在 Jenkins(带有代理节点的 Jenkins)中运行 GIT 项目。 Jenkins 错
是否需要在调用 abort() 之前显式刷新输出流以避免输出丢失? 据我了解,stderr 没有缓冲,因此在输出到 stderr/cerr 后调用 abort > 应该没问题。 stdout/cout
我在将新的 git 变更集推送到 github 存储库时遇到问题。首先,我克隆了深度为 1 的本地更改以删除历史记录: git clone --depth 1 file:///Users/kunal
我正在尝试在 ubuntu 14.04 虚拟机(通过谷歌云)上运行 Protractor 测试,出于某种原因,当我运行“protractor conf.js”时,我收到一条错误消息: E/launch
我是一名优秀的程序员,十分优秀!