试了下linux下的signal函数出错了,求大神解释下啊。

linux 的自定义signal处理函数为什么会不停的触发呀?
如下图所示,除以0的情况下,会触发SIGFPE信号,调用自定义的sig_fpe函数;那么为什么会不停的触发这个函数呀。不应该是只触发一次吗?

`
  1 #include <iostream>
  2 #include <unistd.h>
  3 #include <linux/types.h>
  4 #include <sys/types.h>
  5 #include <signal.h>
  6 using namespace std;
  7 static void sig_fpe(int signo){
  8     cout<<"sig fpe error "<<signo<<endl;
  9 }
 10 
 11 int main(){
 12     signal(SIGFPE , sig_fpe);
 13     int m = 1000/2;                                                                                                
 14     return 0;   
 15 }               `
阅读 3.2k
1 个回答

首先,除以0是UB。
然后,当程序进入signal handler的时候,PC(指向除以0发生的instruction) 会被存起来。
你的handler会忽略对SIGFPE的处理(比如exit program)。
PC之后会还原(指向除以0发生的instruction),然后SIGFPE再次触发,然后。。。

看这里 https://linux.die.net/man/2/s...

According to POSIX, the behavior of a process is undefined after it ignores a SIGFPE, SIGILL, or SIGSEGV signal that was not generated by kill(2) or raise(3). Integer division by zero has undefined result. On some architectures it will generate a SIGFPE signal. (Also dividing the most negative integer by -1 may generate SIGFPE.) Ignoring this signal might lead to an endless loop.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题