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继续打电话.
有人可以解释一下吗?
这很有趣:通过fprintf注释,编译器已确定计算结果:d = b/c是未使用的本地表达式,可以进行优化.
显然,它在执行时没有副作用,但编译器无法在此阶段确定有关运行时环境的任何信息.我很惊讶静态分析不会在现代编译器中将其作为警告(至少).
@vonbrand是对的.你在(异步)信号处理程序中所做的事情很幸运.
编辑:当你说"signal_handler一直在呼唤"时,你的意思是它无限期地重复吗?如果是这样,可能会出现重启基础系统调用的问题.尝试:( siginterrupt(SIGFPE, 1);假设它可用).
| 归档时间: |
|
| 查看次数: |
7695 次 |
| 最近记录: |