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

pyt*_*hon 6 c++ signals sigfpe

好吧,我搜索了有关SIGFPE的文章,然后我写了一些测试,但它的行为很奇怪.然后我必须在这里发帖寻求帮助.GCC/G ++或ISO C++是否明确定义了如果除以零会发生什么?

1)我搜索了这篇文章: 除零之后不会抛出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;
}
Run Code Online (Sandbox Code Playgroud)

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

//fprintf(stderr,"d number is %d\n,d);
Run Code Online (Sandbox Code Playgroud)

然后signal_handler继续打电话.

有人可以解释一下吗?

Bre*_*ale 5

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

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

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


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