《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,系统没有对信号进行排队。

时间: 2024-08-03 07:29:00

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

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

接着昨天学习Unix信号机制,信号内容挺多了,发了两天的时间才了解各大概,日后遇到问题需要多看几遍,掌握核心应用. 7.sigaction函数 sigaction函数的功能是检查或修改与指定信号相关联的处理动作或同时执行这两种操作,可以用sigaction函数实现signal函数.函数原型及结构参数如下: int sigaction(int signum, const struct sigaction *act,struct sigaction *oldact); struct sigactio

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

信号时软中断,很多比较重要的应用程序都需要处理信号,信号提供了一种处理异步事件的方法.每个信号都一个名字,以SIG开头,在<signal.h>头文件中定义信号类型,都是正整数(信号编号). 产生信号的条件: (1)当用户按某些终端键时,引发终端产生的信号. (2)硬件异常产生信号. (3)进程调用kill函数将信号发送给另外一个进程或进程组. (4)用户用kill命令将信号发送给其他进程. (5)检测到某种软件条件已经发送,并将其通知有关进程时候产生信号. 内核在信号出现时候处理方式有:(1)

《APUE》读书笔记-第二十章数据库函数库

本章的内容是开发一个简单的.多用户数据库的C函数库.调用此函数库提供的C语言函数,其他程序可以读取和存储数据库中的记录.绝大部分商用数据库函数库提供多进程同时更新数据库所需要的并发控制,采用建议记录锁.B+树.动态散列实现数据库. 1.函数库 开发类似ndbm函数库,增加了并发控制机制,从而允许多进程同时更新同一数据库.函数接口如下: 1 #include "apue_db.h" 2 DBHANDLE db_open(const char *pathname, int oflag, .

了不起的node.js读书笔记之node.js中的特性_node.js

环境的变化带来了技术大跃进,机遇和挑战同时到来.基于我js也没有学,只好赶鸭子上架一起学了.(>﹏<) 1.先读读书 一开始就不知死活地看<深入浅出node.js>,弄得团团转,看完才知道这本书是要一定基础的.在网上搜刮到了41页的<node入门>,自己学着搭建了一个Web应用.并且在刷新成就感后,就抱读<了不起的node.js>.现准备看完这本书后再回读<深入浅出node.js>. 2.搭建环境 运行git上的例程(3次报错) 在官网下载msi

《javascript模式》读书笔记:容易踩中的那些坑

<javascript模式>第2章 基本技巧 中,讲了一些在前段编程中的一些规范和建议,同时还有一些平常经常忽视且容易踩中的坑. 以下仅是部分内容的摘要和总结,以做备忘用,如有错漏,敬请指出.如需了解更多,可参阅原著,挺不错的书.   1 链式赋值的陷阱 function func(){ var innerVar = globalVar = 20; } func(); console.log(typeof globalVar); //输出结果为? 上面最后的输出结果是?相信不少人会毫不犹豫地说

101 VB.NET Applications 读书笔记(1)

application|笔记 今天开始看<101 Microsoft Visual Basic .NET Applications>. 这本书是很多人集体编写的,带有101个示例程序,涵盖了VB.NET编程的大部分方面,主要作者是Sean Campbell, Scott Swigart, Bob Carver等. 书由MSPress出版,看了一下,感觉还可以,现在开始写读书笔记吧. 书中提到,书中的程序包含了近700个小时的编程实践(Practice),个人认为,学习编程这东西就是要实践,要读

《SQL Server企业级平台管理实践》读书笔记——SQL Server中数据文件空间使用与管理

原文:<SQL Server企业级平台管理实践>读书笔记--SQL Server中数据文件空间使用与管理 1.表和索引存储结构 在SQL Server2005以前,一个表格是以一个B树或者一个堆(heap)存放的.每个B树或者堆,在sysindexes里面都有一条记录相对应.SQL Server2005以后,引入了分区表的概念(Table Partition),在存储组织上,现有的分区基本上替代了原来表格的概念,原先表的概念成为了一个逻辑概念.一个分区就是一个B树或者一个堆.而一张表格则是一个

《SQL Server企业级平台管理实践》读书笔记——SQL Server中收缩数据库不好用的原因

原文:<SQL Server企业级平台管理实践>读书笔记--SQL Server中收缩数据库不好用的原因 数据库管理员有时候需要控制文件的大小,可能选择收缩文件,或者把某些数据文件情况以便从数据库里删除. 这时候我们就要使用到DBCC SHRINKFILE命令,此命令的脚本为: DBCC SHRINKFILE ( { file_name | file_id } { [ , EMPTYFILE ] | [ [ , target_size ] [ , { NOTRUNCATE | TRUNCATE

整理java读书笔记十五之java中的内部类_java

内部类是指在一个外部类的内部再定义一个类.类名不需要和文件夹相同. *内部类可以是静态static的,也可用public,default,protected和private修饰.(而外部顶级类即类名和文件名相同的只能使用public和default). 前言  Java从JDK1.1的时候,就开始引入内部类的概念了,那么小编也通过这篇博客来分享一下Java中有关内部类的一些特性.  什么是内部类?  在很多情况下,类被定义成一个独立的程序单元,但是有时候也会把一个类放在另一个类的内部定义,这个定