2016-03-04 77 views
1

注意:當我提出一個SIGSEGV,如raise(SIGSEGV);,但不引用NULL指針或內存違規時,SEGSEGV被阻止。這裏有什麼問題?是sigsegv的模糊行爲

代碼:

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; 
} 

回答

0

sigprocmask()的手冊頁包含了答案:

如果SIGBUS,SIGFPE,SIGILL或SIGSEGV同時它們被阻塞產生,其結果是不確定的,除非該信號由kill(2),sigqueue(3)raise(3)產生。