《APUE》读书笔记—第十章信号(中)

简介:

复制代码
 1 #include <sys/wait.h>
 2 #include <unistd.h>
 3 #include <sys/types.h>
 4 #include <errno.h>
 5 #include <signal.h>
 6 #include <stdio.h>
 7 #include <stdlib.h>
 8 
 9 static void sig_quit(int signo);
10 
11 int main()
12 {
13     sigset_t    newmask,oldmask,pendmask;
14     if(signal(SIGQUIT,sig_quit) == SIG_ERR)
15     {
16         perror("signal() error");
17         exit(-1);
18     }
19     sigemptyset(&newmask);
20     //添加一个退出信号
21     sigaddset(&newmask,SIGQUIT);
22     //将newmask信号机设置为阻塞,原信号集保存在oldmask中
23     if(sigprocmask(SIG_BLOCK,&newmask,&oldmask) == -1)
24     {
25         perror("sigprocmask() error");
26         exit(-1);
27     }
28     sleep(5);
29     //获取阻塞的信号集
30     if(sigpending(&pendmask) == -1)
31     {
32         perror("sigpending() error");
33         exit(-1);
34     }
35     //判断SIGQUIT是否是阻塞的
36     if(sigismember(&pendmask,SIGQUIT))
37         printf("\nSIGQUIT is pending.\n");
38     //回复原理的信号集
39     if(sigprocmask(SIG_SETMASK,&oldmask,NULL) == -1)
40     {
41         perror("sigprocmask() error");
42         exit(-1);
43     }
44     printf("SITQUIT unblocked\n");
45     sleep(5);
46     exit(0);
47 }
48 
49 static void sig_quit(int signo)
50 {
51     printf("caught SIGQUIT.\n");
52     if(signal(SIGQUIT,SIG_DFL) == SIG_ERR)
53     {
54         perror("signal() error");
55         exit(-1);
56     }
57 }
复制代码

 程序执行结果如下:在中断上键入Ctlr+\退出字符。

第二次运行时候,在进程休眠的时候产生多次SIGQUIT信号,但是解除了该信号的阻塞后,只会向进程发送一个SIGQUIT,系统没有对信号进行排队。

相关文章
|
6月前
|
存储 安全 编译器
[笔记]读书笔记 C++设计新思维《一》基于策略的类设计(下)
[笔记]读书笔记 C++设计新思维《一》基于策略的类设计(下)