第二十二篇:信号的接收和处理

前言

要想掌握 Linux 系统编程,自然要好好学学其信号机制。

本文介绍一个简单的信号接收处理程序,为后面继续深入学习信号机制打下基础。

什么是信号

信号是软件中断,它提供一种处理异步事件的方法。

信号产生的条件

1. 当用户按某些终端按键时。比如:Ctrl + D / Ctrl + C 等。

2. 硬件异常。比如:除数为 0,无效内存引用等。

3. 调用 kill 函数可以将信号发送给另一个进程或者进程组。

4. 当检测到某种软件条件已经发生时。比如:alarm 到时,网络传来某些带外数据时等。

信号处理三种方法

  1. 忽略此信号

  2. 执行系统默认动作 ( 大多数信号的默认动作是终止进程 )

  3. 捕捉信号并使用自定义的函数进行相应处理

Linux 中的各种信号

  参考 APUE 第二版 P236。

代码示例一:捕捉一个用户指定信号并打印

 1 #include <stdio.h>
 2 #include <unistd.h>
 3 #include <signal.h>
 4
 5 // 信号处理函数( 此类函数都是无返回且形参为一个整数,该整数即为所接收到的信号 )
 6 static void sig_usr (int);
 7
 8 int main (void) {
 9
10     // 注册信号和信号处理函数
11     if (signal(SIGUSR1, sig_usr) == SIG_ERR)
12         return 1;
13     if (signal(SIGUSR2, sig_usr) == SIG_ERR)
14         return 2;
15
16     while (1)
17         pause();
18
19     return 0;
20 }
21
22 static void sig_usr (int signo) {
23
24     // 对信号做出处理
25     if (signo == SIGUSR1)
26         printf("收到信号 SIGUSR1\n");
27     if (signo == SIGUSR2)
28         printf("收到信号 SIGUSR2\n");
29 }

运行测试

首先让该程序后台执行:

然后,向该程序分别发送 SIGUSR1 和 SIGUSR2 信号:

可以看到两个信号都被接收并打印出来了

小结

如果需要阻塞某些信号,或者需要进行某些控制,考虑使用 sigaction 函数。

时间: 2024-10-08 00:52:36

第二十二篇:信号的接收和处理的相关文章

Python开发【第二十二篇】:Web框架之Django【进阶】

Python开发[第二十二篇]:Web框架之Django[进阶] 猛击这里:http://www.cnblogs.com/wupeiqi/articles/5246483.html 博客园 首页 新随笔 联系 订阅 管理 随笔-124  文章-127  评论-205 Python之路[第十七篇]:Django[进阶篇 ] Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻

第二十二篇 信念

第二十二篇  信念 "信念"能带给一个人无穷的力量,这些力量可以支撑自己走过漫长的人生.一个人如果没有信念,就很难找到自己的人生方向,所以"信念"也可以理解为希望. 信念可以给到我们希望,也可以给到我们力量,所以一个人的信念会影响到自己的整个人生.当然信念也有好坏之分,好的信念能让自己积极向上.不畏艰难:坏的信念会让我们不思进取.随波逐流.这两种不同的信念会给到我们两种完全不同的人生,就看亲人们如何作出正确的选择. 一个人活在世上,可以选择走正确的人生道路,依靠好的

第二十二篇:再写Windows驱动,再玩Windbg---NET

2011年到现在,就没再怎么搞过Windows驱动了. 最近, 由于项目需要, 试着改一改一个显卡驱动(KMDOD), 从实践上证明, 我在理论上对一个驱动的架构的正确与否.(USB Display = KMDOD + AVStream). 其中, KMDOD是完成显示的部分功能, 完成其中的VidPN(Video present network), 将驱动中原来的POST物理设备转变为USB物理设备. 而AVStream之所以这样提出, 完成是由于USB Video class的启发, 要不然

Egret入门学习日记 --- 第二十二篇(书中 9.7~9.8 节 内容)

第二十二篇(书中 9.7~9.8 节 内容) 开始 9.7节 内容. 重点: 1.进度条ProgressBar的声明和使用. 操作: 1.进度条ProgressBar的声明和使用. 现在真的轻车熟路了,很简单.无非就是设置一下最大值,当前值的属性. 然后,事件监听的话,也是一样的.只不过事件名字的话,我就选书中这个事件吧. 可惜不能发动图,不然你们就可以看到这个进度条,每帧+1的速度前进. 当然,如果你想换自定义皮肤,还是老规矩,去找默认的 EXML 文件. 然后,怎么换素材,就按照自己喜欢的换

python全栈开发基础【第二十二篇】进程池和回调函数

一.数据共享 1.进程间的通信应该尽量避免共享数据的方式 2.进程间的数据是独立的,可以借助队列或管道实现通信,二者都是基于消息传递的. 虽然进程间数据独立,但可以用过Manager实现数据共享,事实上Manager的功能远不止于此. 命令就是一个程序,按回车就会执行(这个只是在windows情况下) tasklist 查看进程 tasklist | findstr pycharm #(findstr是进行过滤的),|就是管道(tasklist执行的内容就放到管道里面了, 管道后面的findst

第二十二篇 Java的一些关键字、 作用域 还有运算符的使用

大家好,我来和大家一起分享一下今天我所学习到的一些知识点,今天我学会了怎么去使用Java中的一些关键字 .作业域和运算符的使用.... 首先来介绍一下 Java中的关键字有哪些,由于数量有很多 ,我就来说一下我今天所学会的关键字 与其作用: 我学到的第一个关键字是----Scanner ,他在Java中 代表这扫描器的作用,并且要引入包,他的作用就是监听键盘的输入,其中见过次数最多的是在注册或登陆界面上,那是候会直接采用你所输入的值,并取出来使用, 第二个关键字是 是-------return,

第二十二篇:C++中的多态机制

前言 封装性,继承性,多态性是面向对象语言的三大特性.其中封装,继承好理解,而多态的概念让许多初学者感到困惑.本文将讲述C++中多态的概念以及多态的实现机制. 什么是多态? 多态就是多种形态,就是许多情况下可以互换地使用基类型和派生类型的多种形态. 多态的实现 依赖于动态绑定机制. 动态绑定机制相关 动态绑定是函数实际参数和形式参数绑定的一种方式,它是指我们能够在函数接口中使用继承层次中任意类型的对象,无需关心对象的具体类型. 动态执行接口函数的对象参数的哪个函数得在程序实际执行的时候才能确定

Python之路【第二十二篇】:Django之Model操作

Django之Model操作 一.字段 AutoField(Field) - int自增列,必须填入参数 primary_key=True BigAutoField(AutoField) - bigint自增列,必须填入参数 primary_key=True 注:当model中如果没有自增列,则自动会创建一个列名为id的列 from django.db import models class UserInfo(models.Model): # 自动创建一个列名为id的且为自增的整数列 usern

Django 【第二十二篇】ModelForm

一.ModelForm的介绍 ModelForm a. class Meta: model, # 对应Model的 fields=None, # 字段 exclude=None, # 排除字段 labels=None, # 提示信息 help_texts=None, # 帮助提示信息 widgets=None, # 自定义插件 error_messages=None, # 自定义错误信息(整体错误信息from django.core.exceptions import NON_FIELD_ERR