什么是C/C++处理程序SIGFPE?

前端之家收集整理的这篇文章主要介绍了什么是C/C++处理程序SIGFPE?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
好吧,我搜索了有关SIGFPE的文章,然后我写了一些测试,但它的行为很奇怪.然后我必须在这里发帖寻求帮助. GCC / G或ISO C是否清楚地定义了如果除以零会发生什么?

1)我搜索了这篇文章
Division by zero does not throw SIGFPE
同样输出是inf

2)如果我重写如下:

void signal_handler (int signo) {
    if(signo == SIGFPE) {
      std::cout << "Caught FPE\n";
    }
}

int main (void) {
  signal(SIGFPE,(*signal_handler));

  int b = 1;
  int c = 0;
  int d = b/c;
  //fprintf(stderr,"d number is %d\n,d);
  return 0;
}

然后signal_handler将不会发生.但如果我取消注释该行

//fprintf(stderr,d);

然后signal_handler继续打电话.

有人可以解释一下吗?

解决方法

这很有趣:在fprintf注释掉后,编译器确定计算结果:d = b / c是一个未使用的本地表达式,可以进行优化.

显然,它在执行时没有副作用,但编译器无法在此阶段确定有关运行时环境的任何信息.我很惊讶静态分析不会在现代编译器中将其作为警告(至少).

@vonbrand是对的.你在(异步)信号处理程序中所做的事情很幸运.

编辑:当你说“signal_handler一直在呼唤”时,你的意思是它无限期地重复吗?如果是这样,可能会出现重启基础系统调用的问题.尝试:siginterrupt(SIGFPE,1); (假设它可用).

猜你在找的C&C++相关文章