#include<stdio.h>
#include<signal.h>
#include<sys/types.h>
void f(int signo)
{
printf("signo=%d\n",signo);
}
int main(int argc,char* argv[])
{
signal(SIGFPE,f);
int div=argc/(argc-1);
return 0;
}
该捕捉除零信号的程序会陷入死循环。是因为除零属于异常,不可恢复,每次系统调用信号处理函数后,还会继续返回到除零那里继续执行,因此陷入死循环。
可以在信号处理函数中恢复系统默认处理:
void f(int signo)
{
printf("signo=%d\n",signo);
signal(SIGFPE, SIG_DFL); //这里将SIGFPE的信号变成系统默认处理就好了
}
或者用setjump/longjump 来跳过SIGFPE所在语句:
#include <stdio.h>
#include <signal.h>
#include <setjmp.h>
jmp_buf env;
void handler (int signal) {
printf("caught exception\n");
longjmp(env, 2);
}
int main(int argc, char* argv[]) {
{
struct sigaction sa = {};
sa.sa_handler = handler;
//sigemptyset(&sa.sa_mask);
//sa.sa_flags = 0;
if(sigaction(SIGFPE, &sa, NULL) == -1) {
perror("sigaction");
}
}
if (0 == setjmp(env)) {
int a = 3/(argc - 1);
printf("a is %d\n", a);
} else {
/*exception*/
printf("in exception\n");
}
return 1;
}