为何捕捉到SIGSEGV信号后程序不终止
写了一个小程序,意在发生segment fault后捕捉SIGSEGV信号,可是程序却一直运行不终止了。为何?程序如下:
#include<stdio.h>
#include<signal.h>
void sig_cap(int signo, siginfo_t *p_info, void *info) {
printf("caputre signo: %d\n", signo);
printf("sigal number is:%d\n", p_info->si_signo);
printf("pid is %d\n", p_info->si_pid);
}
void sig_reg(int signo) {
struct sigaction sa;
sa.sa_flags = SA_SIGINFO;
sigemptyset(&sa.sa_mask);
sa.sa_sigaction = sig_cap;
sigaction(signo, &sa, NULL);
}
int main(int argc,char *argv[]){
int *p = NULL;
sig_reg(SIGSEGV);
sig_reg(SIGINT);
sig_reg(SIGQUIT);
printf("pid = %d\n", getpid());
*p = 2;
return 0;
}
~/code/signal$ gcc sigsegv.c -o sigsegv
~/code/signal$ ./sigsegv
运行sigsegv后,程序一直打印,不终止。打印如下:
caputre signo: 11
sigal number is:11
pid is 0
caputre signo: 11
sigal number is:11
pid is 0
caputre signo: 11
sigal number is:11
pid is 0
caputre signo: 11
sigal number is:11
pid is 0
caputre signo: 11
sigal number is:11
pid is 0
caputre signo: 11
sigal number is:11
pid is 0
caputre signo: 11
sigal number is:11
pid is 0
每个信号都有 信号处理程序;SIGSEGV 的默认处理是生成core文件 并 终止程序。
但是如果你自己注册新的处理程序,信号收到后就执行你新注册的处理程序,如果想退出,就在你的处理程序里面显式的调用退出。 不明白为何反复执行信号注册处理函数?是每次执行完信号处理程序,接着又收到了SIGSEGV信号吗?若是这样,为何会多次收到信号呢?回复 2# yjh777
可能是信号处理函数返回后,还是继续执行 *p = 2; 然后又触发信号,死循环了。 可能是信号处理函数返回后,还是继续执行 *p = 2; 然后又触发信号,死循环了。 可能是信号处理函数返回后,还是继续执行 *p = 2; 然后又触发信号,死循环了。 可能是信号处理函数返回后,还是继续执行 *p = 2; 然后又触发信号,死循环了。 回复 3# jieniyisheng521
可能是信号处理函数返回后,还是继续执行 *p = 2; 然后又触发信号,死循环了。
回复 3# jieniyisheng521
可能是信号处理函数返回后,还是继续执行 *p = 2; 然后又触发信号,死循环了。
回复 3# jieniyisheng521
可能是信号处理函数返回后,还是继续执行 *p = 2; 然后又触发信号,死循环了。
页:
[1]
2