void hander(int sig) { printf("hand %d\n",clock()); printf("catch %s\n",strsignal(sig)); } int main(void) { setbuf(stdout,NULL); signal(SIGINT,hander);//为SIGINT设置信号处理程序 sigset_t mask,empty; sigemptyset(&mask);//将信号集设为空 sigemptyset(&empty); sigaddset(&mask,SIGINT);//将中断信号加入信号集 sigprocmask(SIG_BLOCK,&mask,NULL);//阻塞信号集里的信号,信号集里面有中断信号,所以阻塞中断信号 raise(SIGINT);//向自身进程发送中断信号,此时该信号被阻塞,所以进程不会收到 sigprocmask(SIG_SETMASK,&empty,NULL);//解除对中断信号的阻塞 printf("main %d\n",clock()); }
输出如下
~$ ./a.out
hand 2462
catch Interrupt: 2
main 2506
可以看到先输出的是在信号处理函数里的时钟计数
说明了当sigprocmask(SIG_SETMASK,&empty,NULL)执行完后,进程立即收到中断信号并进入信号处理函数