资料介绍
8.3 信号
8.3.1 信号概述
信号是UNIX中所使用的进程通信的一种最古老的方法。它是在软件层次上对中断机制的一种模拟,是一种异步通信方式。信号可以直接进行用户空间进程和内核进程之间的交互,内核进程也可以利用它来通知用户空间进程发生了哪些系统事件。它可以在任何时候发给某一进程,而无需知道该进程的状态。如果该进程当前并未处于执行态,则该信号就由内核保存起来,直到该进程恢复执行再传递给它为止;如果一个信号被进程设置为阻塞,则该信号的传递被延迟,直到其阻塞被取消时才被传递给进程。
在第2章kill命令中曾讲解到“−l”选项,这个选项可以列出该系统所支持的所有信号的列表。在笔者的系统中,信号值在32之前的则有不同的名称,而信号值在32以后的都是用“SIGRTMIN”或“SIGRTMAX”开头的,这就是两类典型的信号。前者是从UNIX系统中继承下来的信号,为不可靠信号(也称为非实时信号);后者是为了解决前面“不可靠信号”的问题而进行了更改和扩充的信号,称为“可靠信号”(也称为实时信号)。那么为什么之前的信号不可靠呢?这里首先要介绍一下信号的生命周期。
一个完整的信号生命周期可以分为3个重要阶段,这3个阶段由4个重要事件来刻画的:信号产生、信号在进程中注册、信号在进程中注销、执行信号处理函数,如图8.6所示。相邻两个事件的时间间隔构成信号生命周期的一个阶段。要注意这里的信号处理有多种方式,一般是由内核完成的,当然也可以由用户进程来完成,故在此没有明确画出。
图8.6 信号生命周期
一个不可靠信号的处理过程是这样的:如果发现该信号已经在进程中注册,那么就忽略该信号。因此,若前一个信号还未注销又产生了相同的信号就会产生信号丢失。而当可靠信号发送给一个进程时,不管该信号是否已经在进程中注册,都会被再注册一次,因此信号就不会丢失。所有可靠信号都支持排队,而所有不可靠信号都不支持排队。
注意这里信号的产生、注册和注销等是指信号的内部实现机制,而不是调用信号的函数实现。因此,信号注册与否,与本节后面讲到的发送信号函数(如kill()等)以及信号安装函数(如signal()等)无关,只与信号值有关。
用户进程对信号的响应可以有3种方式。
n 忽略信号,即对信号不做任何处理,但是有两个信号不能忽略,即SIGKILL及SIGSTOP。
n 捕捉信号,定义信号处理函数,当信号发生时,执行相应的自定义处理函数。
n 执行缺省操作,Linux对每种信号都规定了默认操作。
Linux中的大多数信号是提供给内核的,表8.6列出了Linux中最为常见信号的含义及其默认操作。
表8.6 常见信号的含义及其默认操作
信 号 名含 义默 认 操 作
SIGHUP该信号在用户终端连接(正常或非正常)结束时发出,通常是在终端的控制进程结束时,通知同一会话内的各个作业与控制终端不再关联终止
SIGINT该信号在用户键入INTR字符(通常是Ctrl-C)时发出,终端驱动程序发送此信号并送到前台进程中的每一个进程终止
SIGQUIT该信号和SIGINT类似,但由QUIT字符(通常是Ctrl-\)来控制终止
SIGILL该信号在一个进程企图执行一条非法指令时(可执行文件本身出现错误,或者试图执行数据段、堆栈溢出时)发出终止
SIGFPE该信号在发生致命的算术运算错误时发出。这里不仅包括浮点运算错误,还包括溢出及除数为0等其他所有的算术错误终止
SIGKILL该信号用来立即结束程序的运行,并且不能被阻塞、处理或忽略终止
SIGALRM该信号当一个定时器到时的时候发出终止
SIGSTOP该信号用于暂停一个进程,且不能被阻塞、处理或忽略暂停进程
SIGTSTP该信号用于交互停止进程,用户键入SUSP字符时(通常是Ctrl+Z)发出这个信号停止进程
SIGCHLD子进程改变状态时,父进程会收到这个信号忽略
SIGABORT进程异常终止时发出
8.3.2 信号发送与捕捉
发送信号的函数主要有kill()、raise()、alarm()以及pause(),下面就依次对其进行介绍。
1.kill()和raise()
(1)函数说明。
kill()函数同读者熟知的kill系统命令一样,可以发送信号给进程或进程组(实际上,kill系统命令只是kill()函数的一个用户接口)。这里需要注意的是,它不仅可以中止进程(实际上发出SIGKILL信号),也可以向进程发送其他信号。
与kill()函数所不同的是,raise()函数允许进程向自身发送信号。
(2)函数格式。
表8.7列出了kill()函数的语法要点。
表8.7 kill()函数语法要点
所需头文件#include 《signal.h》
#include 《sys/types.h》
函数原型int kill(pid_t pid, int sig)
函数传入值pid:正数:要发送信号的进程号
0:信号被发送到所有和当前进程在同一个进程组的进程
-1:信号发给所有的进程表中的进程(除了进程号最大的进程外)
《-1:信号发送给进程组号为-pid的每一个进程
sig:信号
函数返回值成功:0
出错:-1
表8.8列出了raise()函数的语法要点。
表8.8 raise()函数语法要点
所需头文件#include 《signal.h》
#include 《sys/types.h》
函数原型int raise(int sig)
函数传入值sig:信号
函数返回值成功:0
出错:-1
8.3.1 信号概述
信号是UNIX中所使用的进程通信的一种最古老的方法。它是在软件层次上对中断机制的一种模拟,是一种异步通信方式。信号可以直接进行用户空间进程和内核进程之间的交互,内核进程也可以利用它来通知用户空间进程发生了哪些系统事件。它可以在任何时候发给某一进程,而无需知道该进程的状态。如果该进程当前并未处于执行态,则该信号就由内核保存起来,直到该进程恢复执行再传递给它为止;如果一个信号被进程设置为阻塞,则该信号的传递被延迟,直到其阻塞被取消时才被传递给进程。
在第2章kill命令中曾讲解到“−l”选项,这个选项可以列出该系统所支持的所有信号的列表。在笔者的系统中,信号值在32之前的则有不同的名称,而信号值在32以后的都是用“SIGRTMIN”或“SIGRTMAX”开头的,这就是两类典型的信号。前者是从UNIX系统中继承下来的信号,为不可靠信号(也称为非实时信号);后者是为了解决前面“不可靠信号”的问题而进行了更改和扩充的信号,称为“可靠信号”(也称为实时信号)。那么为什么之前的信号不可靠呢?这里首先要介绍一下信号的生命周期。
一个完整的信号生命周期可以分为3个重要阶段,这3个阶段由4个重要事件来刻画的:信号产生、信号在进程中注册、信号在进程中注销、执行信号处理函数,如图8.6所示。相邻两个事件的时间间隔构成信号生命周期的一个阶段。要注意这里的信号处理有多种方式,一般是由内核完成的,当然也可以由用户进程来完成,故在此没有明确画出。
图8.6 信号生命周期
一个不可靠信号的处理过程是这样的:如果发现该信号已经在进程中注册,那么就忽略该信号。因此,若前一个信号还未注销又产生了相同的信号就会产生信号丢失。而当可靠信号发送给一个进程时,不管该信号是否已经在进程中注册,都会被再注册一次,因此信号就不会丢失。所有可靠信号都支持排队,而所有不可靠信号都不支持排队。
注意这里信号的产生、注册和注销等是指信号的内部实现机制,而不是调用信号的函数实现。因此,信号注册与否,与本节后面讲到的发送信号函数(如kill()等)以及信号安装函数(如signal()等)无关,只与信号值有关。
用户进程对信号的响应可以有3种方式。
n 忽略信号,即对信号不做任何处理,但是有两个信号不能忽略,即SIGKILL及SIGSTOP。
n 捕捉信号,定义信号处理函数,当信号发生时,执行相应的自定义处理函数。
n 执行缺省操作,Linux对每种信号都规定了默认操作。
Linux中的大多数信号是提供给内核的,表8.6列出了Linux中最为常见信号的含义及其默认操作。
表8.6 常见信号的含义及其默认操作
信 号 名含 义默 认 操 作
SIGHUP该信号在用户终端连接(正常或非正常)结束时发出,通常是在终端的控制进程结束时,通知同一会话内的各个作业与控制终端不再关联终止
SIGINT该信号在用户键入INTR字符(通常是Ctrl-C)时发出,终端驱动程序发送此信号并送到前台进程中的每一个进程终止
SIGQUIT该信号和SIGINT类似,但由QUIT字符(通常是Ctrl-\)来控制终止
SIGILL该信号在一个进程企图执行一条非法指令时(可执行文件本身出现错误,或者试图执行数据段、堆栈溢出时)发出终止
SIGFPE该信号在发生致命的算术运算错误时发出。这里不仅包括浮点运算错误,还包括溢出及除数为0等其他所有的算术错误终止
SIGKILL该信号用来立即结束程序的运行,并且不能被阻塞、处理或忽略终止
SIGALRM该信号当一个定时器到时的时候发出终止
SIGSTOP该信号用于暂停一个进程,且不能被阻塞、处理或忽略暂停进程
SIGTSTP该信号用于交互停止进程,用户键入SUSP字符时(通常是Ctrl+Z)发出这个信号停止进程
SIGCHLD子进程改变状态时,父进程会收到这个信号忽略
SIGABORT进程异常终止时发出
8.3.2 信号发送与捕捉
发送信号的函数主要有kill()、raise()、alarm()以及pause(),下面就依次对其进行介绍。
1.kill()和raise()
(1)函数说明。
kill()函数同读者熟知的kill系统命令一样,可以发送信号给进程或进程组(实际上,kill系统命令只是kill()函数的一个用户接口)。这里需要注意的是,它不仅可以中止进程(实际上发出SIGKILL信号),也可以向进程发送其他信号。
与kill()函数所不同的是,raise()函数允许进程向自身发送信号。
(2)函数格式。
表8.7列出了kill()函数的语法要点。
表8.7 kill()函数语法要点
所需头文件#include 《signal.h》
#include 《sys/types.h》
函数原型int kill(pid_t pid, int sig)
函数传入值pid:正数:要发送信号的进程号
0:信号被发送到所有和当前进程在同一个进程组的进程
-1:信号发给所有的进程表中的进程(除了进程号最大的进程外)
《-1:信号发送给进程组号为-pid的每一个进程
sig:信号
函数返回值成功:0
出错:-1
表8.8列出了raise()函数的语法要点。
表8.8 raise()函数语法要点
所需头文件#include 《signal.h》
#include 《sys/types.h》
函数原型int raise(int sig)
函数传入值sig:信号
函数返回值成功:0
出错:-1
下载该资料的人也在下载
下载该资料的人还在阅读
更多 >
- 电气信息工程丛书之Linux PowerPC详解-核心篇 0次下载
- 谈谈嵌入式系统中多进程设计与进程通信
- 嵌入式Linux进程 -进程间通信
- Linux虚拟机之tcpdump命令操作详解 23次下载
- 串口通信之读取与发送及LabView文件下载 179次下载
- BLE实验详解之蓝牙温度计设计方案 25次下载
- BLE实验详解之蓝牙血压计设计方案 36次下载
- BLE实验详解之蓝牙键盘设计方案 58次下载
- linux操作系统下的进程通信 0次下载
- 进程间通信之消息队列详解 0次下载
- 进程间通信之Linux下进程间通信概述 0次下载
- 进程间通信之信号量浅析 0次下载
- 进程间通信之共享内存 1次下载
- 进程间通信之:管道 0次下载
- 逻辑漏洞之越权详解 5次下载
- 突发通信信号是啥?突发通信信号是如何产生的? 866次阅读
- Linux下进程通信的方法 565次阅读
- 关于Python多进程和多线程详解 678次阅读
- SoC核间通信的实现机制之mailbox中断 1385次阅读
- 从进程模型转换成线程模型的优缺点 354次阅读
- Jacinto 7核间通信解决方案 1058次阅读
- 进程间通信的实现方式 696次阅读
- Linux进程间通信方法之管道 1820次阅读
- 鸿蒙内核进程间为何要通讯? 2637次阅读
- 浅谈进程之间的通信方式 2783次阅读
- USB接口外壳地和信号地间的处理 1.6w次阅读
- RS485通信原理图及程序实例详解 22.9w次阅读
- Linux进程的概念及进程通信的应用场景 6622次阅读
- 进程间与线程间的通信方式 8817次阅读
- Linux的系统选择、体系结构及应用详解 4184次阅读
下载排行
本周
- 1TC358743XBG评估板参考手册
- 1.36 MB | 330次下载 | 免费
- 2开关电源基础知识
- 5.73 MB | 6次下载 | 免费
- 3100W短波放大电路图
- 0.05 MB | 4次下载 | 3 积分
- 4嵌入式linux-聊天程序设计
- 0.60 MB | 3次下载 | 免费
- 5基于FPGA的光纤通信系统的设计与实现
- 0.61 MB | 2次下载 | 免费
- 6基于FPGA的C8051F单片机开发板设计
- 0.70 MB | 2次下载 | 免费
- 751单片机窗帘控制器仿真程序
- 1.93 MB | 2次下载 | 免费
- 8基于51单片机的RGB调色灯程序仿真
- 0.86 MB | 2次下载 | 免费
本月
- 1OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234315次下载 | 免费
- 2555集成电路应用800例(新编版)
- 0.00 MB | 33564次下载 | 免费
- 3接口电路图大全
- 未知 | 30323次下载 | 免费
- 4开关电源设计实例指南
- 未知 | 21548次下载 | 免费
- 5电气工程师手册免费下载(新编第二版pdf电子书)
- 0.00 MB | 15349次下载 | 免费
- 6数字电路基础pdf(下载)
- 未知 | 13750次下载 | 免费
- 7电子制作实例集锦 下载
- 未知 | 8113次下载 | 免费
- 8《LED驱动电路设计》 温德尔著
- 0.00 MB | 6653次下载 | 免费
总榜
- 1matlab软件下载入口
- 未知 | 935054次下载 | 免费
- 2protel99se软件下载(可英文版转中文版)
- 78.1 MB | 537796次下载 | 免费
- 3MATLAB 7.1 下载 (含软件介绍)
- 未知 | 420026次下载 | 免费
- 4OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234315次下载 | 免费
- 5Altium DXP2002下载入口
- 未知 | 233046次下载 | 免费
- 6电路仿真软件multisim 10.0免费下载
- 340992 | 191185次下载 | 免费
- 7十天学会AVR单片机与C语言视频教程 下载
- 158M | 183278次下载 | 免费
- 8proe5.0野火版下载(中文版免费下载)
- 未知 | 138040次下载 | 免费
评论
查看更多