操作系统基本概念——信号(一)

信号是事件发生时对进程的通知机制,有时也称为软件中断。信号与硬件中断的相似之处在于打断了程序执行的正常流程,大多数情况下,无法预测信号到达的准确时间。


一个(具有合适权限的)进程能够向另一进程发送信号。这一做法可作为一种同步技术,甚至是进程间通信(IPC)的原始形式。


进程也可以向自身发送信号。但是发往进程的诸多信号,通常都是源于内核。


有时需要确保一段代码不被传递来的信号中断,为了做到这点,可将信号添加到进程的信号掩码中——目前会阻塞该组信号的到达。如果所产生的信号属于阻塞之列,那么信号将保持等待状态,直至稍后对其解除阻塞(从掩码信号中移除)。进程可使用各种系统调用对其信号掩码添加和移除信号。


以下时间可引发内核为进程产生信号:

(1)硬件异常。硬件检测到一个错误条件并通知内核,随机再由内核发送相应信号给相关进程。硬件异常的例子包括执行一条异常的机器语言指令。例如:被0除, 或者引用了无法访问的内存区域。

(2)用户键入了能够产生信号的终端特殊字符。其中包括中断字符(Ctrl+C)、暂停字符(Ctrl+Z)。

(3)发生了软件事件。例如,针对文件描述符的输出变为有效,调整了终端窗口大小,定时器到期,进程执行的CPU时间超限,或者该进程的某个子进程退出。

针对每个信号都定义了一个唯一的(小)整数,从一开始顺序展开。为了可移植性,一般都用在<signal.h>中定义的符号名(形如SIGxxxx)而不是用数字。例如,当用户键入中断字符时,将传递给进程SIGINT信号(信号编号为2)。

信号有两大类:

(1)用于内核向进程通知事件,构成所谓传统或标准信号。标准信号范围:1~31。

(2)由实时信号构成。


信号因某些事件而产生后,会于稍后被传递给某一进程,进程也会采取某些措施来相应信号。在产生和到达期间,信号处于等待状态(pending)。

信号到达后,进程视具体信号执行如下默认操作之一。

(1)忽略信号:内核将信号丢弃,信号对进程没有任何影响(进程永远不知道曾经出现过该信号)。

(2)终止(杀死)进程:这有时是指进程异常终止,而不是进程因调用exit()而发生的正常终止。

(3)产生核心转储文件,同时进程终止:核心转储文件包含对进程虚拟内存的镜像,可将其加载到调试器中以检查进程终止时的状态。

(4)停止(不是终止)进程:使进程暂停执行。

(5)执行之前被暂停的进程。


除了根据特定信号而采取默认行为之外,程序也能改变信号到达时的响应行为。也将次称之为对信号的处置(disposition)设置。程序可以将对信号的处置设置为如下之一。

(1)采取默认行为。

(2)忽略信号。

(3)执行信号处理器程序。


信号处理其是由程序员编写的函数,用于为响应传递来的信号而执行适当任务。例如shell为SIGINT信号提供了一个处理器程序,令其停止当前正在执行的工作,并返回到(shell的)主输入循环,并再次向用户呈现shell提示符。


除了默认处置外,无法将信号处置设置为终止进程或者转储核心。


posted @ 2016-11-16 20:33  sdflyb  阅读(907)  评论(0编辑  收藏  举报