新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 进程间通信之:信号

进程间通信之:信号

作者:时间:2013-09-13来源:网络收藏

本文引用地址:http://www.eepw.com.cn/article/257126.htm

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 执行缺省操作,对每种信号都规定了默认操作。

中的大多数信号是提供给内核的,表8.6列出了中最为常见信号的含义及其默认操作。

表8.6 常见信号的含义及其默认操作

信号名

含义

默认操作

SIGHUP

该信号在用户终端连接(正常或非正常)结束时发出,通常是在终端的控制进程结束时,通知同一会话内的各个作业与控制终端不再关联

终止

SIGINT

该信号在用户键入INTR字符(通常是Ctrl-C)时发出,终端驱动程序发送此信号并送到前台进程中的每一个进程

终止

SIGQUIT

该信号和SIGINT类似,但由QUIT字符(通常是Ctrl-)来控制

终止

SIGILL

该信号在一个进程企图执行一条非法指令时(可执行文件本身出现错误,或者试图执行数据段、堆栈溢出时)发出

终止

SIGFPE

该信号在发生致命的算术运算错误时发出。这里不仅包括浮点运算错误,还包括溢出及除数为0等其他所有的算术错误

终止

SIGKILL

该信号用来立即结束程序的运行,并且不能被阻塞、处理或忽略

终止

SIGALRM

该信号当一个定时器到时的时候发出

终止

SIGSTOP

该信号用于暂停一个进程,且不能被阻塞、处理或忽略

暂停进程

SIGTSTP

该信号用于交互停止进程,用户键入SUSP字符时(通常是Ctrl+Z)发出这个信号

停止进程

SIGCHLD

子进程改变状态时,父进程会收到这个信号

忽略

SIGABORT

进程异常终止时发出

linux操作系统文章专题:linux操作系统详解(linux不再难懂)

模拟信号相关文章:什么是模拟信号


linux相关文章:linux教程


数字通信相关文章:数字通信原理


通信相关文章:通信原理



上一页 1 2 3 4 5 6 7 下一页

评论


相关推荐

技术专区

关闭