对于sigsegv来说,这是一种模棱两可的行为

时间:2016-03-04 13:18:58

标签: c linux segmentation-fault signals ipc

注意:当我引发类似raise(SIGSEGV);的SIGSEGV但未解除对NULL指针或内存违规的解除引用时,SEGSEGV被阻止。这是什么问题?

代码:

void sig_handler(int signo)
{
       psignal(signo,"i am in sig_handler\n");
}

int main()
{
    sigset_t intmask;
    int c = 0, *p = NULL;

    if((signal(SIGSEGV , sig_handler)) == SIG_ERR)
             perror("signal call is failed\n");
    if ((sigemptyset(&intmask) == -1) || (sigaddset(&intmask, SIGSEGV) == -1))    
          perror("Failed to initialize the signal mask");
    sigprocmask(SIG_BLOCK, &intmask, NULL);
    fprintf(stdout, "SIGINT signal blocked\n");
    c = *p;
}

1 个答案:

答案 0 :(得分:0)

sigprocmask()的手册页有答案:

  

如果SIGBUS,SIGFPE,SIGILL或SIGSEGV在被阻止时生成,则结果是未定义的,除非信号是由kill(2)sigqueue(3)raise(3)生成的。