jieniyisheng521 发表于 2015-12-16 21:26

为何捕捉到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

yjh777 发表于 2015-12-17 16:43

每个信号都有 信号处理程序;SIGSEGV 的默认处理是生成core文件 并 终止程序。
但是如果你自己注册新的处理程序,信号收到后就执行你新注册的处理程序,如果想退出,就在你的处理程序里面显式的调用退出。

jieniyisheng521 发表于 2015-12-18 22:02

不明白为何反复执行信号注册处理函数?是每次执行完信号处理程序,接着又收到了SIGSEGV信号吗?若是这样,为何会多次收到信号呢?回复 2# yjh777


   

yjh777 发表于 2015-12-23 17:41

可能是信号处理函数返回后,还是继续执行 *p = 2; 然后又触发信号,死循环了。

yjh777 发表于 2015-12-23 17:42

可能是信号处理函数返回后,还是继续执行 *p = 2; 然后又触发信号,死循环了。

yjh777 发表于 2015-12-23 17:44

可能是信号处理函数返回后,还是继续执行 *p = 2; 然后又触发信号,死循环了。

yjh777 发表于 2015-12-23 17:45

可能是信号处理函数返回后,还是继续执行 *p = 2; 然后又触发信号,死循环了。

yjh777 发表于 2015-12-23 17:50

回复 3# jieniyisheng521

可能是信号处理函数返回后,还是继续执行 *p = 2; 然后又触发信号,死循环了。


   

yjh777 发表于 2015-12-23 17:51

回复 3# jieniyisheng521

可能是信号处理函数返回后,还是继续执行 *p = 2; 然后又触发信号,死循环了。


   

yjh777 发表于 2015-12-23 18:28

回复 3# jieniyisheng521

可能是信号处理函数返回后,还是继续执行 *p = 2; 然后又触发信号,死循环了。


   
页: [1] 2
查看完整版本: 为何捕捉到SIGSEGV信号后程序不终止