原文来自https://blog.youkuaiyun.com/li_wen01/article/details/54343796
对代码进行批注,加深理解
1 #include <stdio.h>2 #include <signal.h>
3 void handler(int sig)
4 {
5 printf("handle the signal %d\n",sig);
6 }
7 int main(void)
8 {
9 int ret;
10 sigset_t sigset,ign;
11 struct sigaction act;//信号的处理方式和signal函数功能相同
12 act.sa_handler=handler;//信号的处理方式是自定义,SIN_DFL(默认),SIN_ING(忽略)
13 sigemptyset(&act.sa_mask);
14 act.sa_flags=0;//和前面的处理一样,基本设置
15 sigemptyset(&sigset);//清空sigset信号集
16 sigemptyset(&ign); //清空ign信号集
17 sigaddset(&sigset,SIGINT);//往sigset信号集中加入SIGINT信号
18 sigaction(SIGINT,&act,0);//将SIGINT中的所有信号设置为act对应的处理方式。
19 printf("wait the signal SIGINT(ctrl+c)\n");
20 pause();//信号打断睡眠进程
21 sigprocmask(SIG_SETMASK,&sigset,0);//将sigset中的所有信号屏蔽
22 printf("please press ctrl+c in 20s...\n");//按ctrl+C 并不能中断sleep,信号被屏蔽了
23 sleep(20);
24 sigpending(&ign);//将进程挂起,将悬而未决信号放入ign信号集中
25 if(sigismember(&ign,SIGINT))//判断SIGINT是否在ign信号集中,若在说明该信号被屏蔽了
26 printf("the SIGINT signal has ignored\n");
27 sigdelset(&sigset,SIGINT);//将SIGINT信号从sigset信号集中删除
28 printf("wait SIGINT signal..\n");
29 sigsuspend(&sigset);//暂时只屏蔽sigset信号集的信号,并挂起进程,收到非sigset信号集的信号,该函数> 就返回了,进程不再被挂起,并将sigprocmask恢复为原来所屏蔽的信号,重点(此刻SIGINT还是处于被屏蔽的状态
,此刻按ctrl+c还是不会调用handler函数)
30 sigprocmask(SIG_SETMASK,&sigset,0);//重新设置屏蔽的信号集
31 act.sa_handler=SIG_DFL;
32 sigaction(SIGINT,&act,0);//改变SIGINT的处理方式,就不再打印"hello"
33 printf("process will exit in 20s...\n");
34 sleep(20);
35 printf("hello\n");
36 return 0;