注意:当我引发类似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;
}
答案 0 :(得分:0)
sigprocmask()
的手册页有答案:
如果SIGBUS,SIGFPE,SIGILL或SIGSEGV在被阻止时生成,则结果是未定义的,除非信号是由
kill(2)
,sigqueue(3)
或raise(3)
生成的。