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 } `
付费偷看金额在0.1-10元之间
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.
看这里 https://linux.die.net/man/2/s...
首先,除以0是UB。
然后,当程序进入signal handler的时候,PC(指向除以0发生的instruction) 会被存起来。
你的handler会忽略对SIGFPE的处理(比如exit program)。
PC之后会还原(指向除以0发生的instruction),然后SIGFPE再次触发,然后。。。
一周热门 更多>