好吧,我搜索了有关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); (假设它可用).