快捷搜索:

Linux下的信号机制

旌旗灯号是在软件层次上对中断机制的一种模拟。在道理上,一个进程收到一个旌旗灯号与处置惩罚器收到一其中断哀求可以说是一样的。旌旗灯号是异步的,一个进程不必经由过程任何操作来等待旌旗灯号的到达,事实上,进程也不知道旌旗灯号到底什么时刻到达。旌旗灯号可以直接进行用户空间进程和内核进程之间的交互,内核进程也可以使用它来看护用户空间进程发生了哪些系统事故。它可以在任何时刻发给某一进程,而无须知道该进程的状态。假如该进程当前并未处于履行态,则该旌旗灯号就由内核保存起来,直到该进程规复履行再通报给它为止;假如一个旌旗灯号被进程设置为壅闭,则该旌旗灯号的通报被延迟,直到其壅闭被取消时才被通报给进程。

旌旗灯号是进程间通信机制中独一的异步通信机制,可以看做是异步看护,看护接管旌旗灯号的进程有哪些工作发生了。旌旗灯号机制颠末Posix实时扩展后,功能加倍强大年夜,除了基础看护功能外,还可以通报附加信息。

旌旗灯号事故的发生有两个滥觞:硬件滥觞(如我们按下了键盘上的按钮或者呈现其他硬件故障);软件滥觞,常用发送旌旗灯号的系统函数有kill()、raise()、alarm()、setiTImer()和sigqueue()等,软件滥觞还包括一些不法运算等操作。

进程可以经由过程3种要领来相应一个旌旗灯号。

1.轻忽旌旗灯号

轻忽旌旗灯号即对旌旗灯号不做任何处置惩罚,此中,有两个旌旗灯号不能轻忽:SIGKILL和SIGSTOP。

2.捕捉旌旗灯号

定义旌旗灯号处置惩罚函数,当旌旗灯号发生时,履行响应的处置惩罚函数。

3.履行默认操作

Linux对每种旌旗灯号都规定了默认操作,如表1所示。

一个完备的旌旗灯号生命周期可以分为3个紧张阶段,这3个阶段由4个紧张变糊弄形貌的:旌旗灯号孕育发生、旌旗灯号在进程中注册、旌旗灯号在进程中注销、履行旌旗灯号处置惩罚函数。这里旌旗灯号的孕育发生、注册、注销等是指旌旗灯号的内部实现机制,而不是旌旗灯号的函数实现。是以,旌旗灯号注册与否与本节后面讲到的发送旌旗灯号函数(如kill()等)及旌旗灯号安装函数(如signal()等)无关,只与旌旗灯号值有关。

相邻两个事故的光阴距离构成旌旗灯号生命周期的一个阶段。要留意这里的旌旗灯号处置惩罚有多种要领,一样平常是由内核完成的,当然也可以由用户进程来完成,故在此没有明确指出。

旌旗灯号的处置惩罚包括旌旗灯号的发送、捕获及旌旗灯号的处置惩罚,它们有各自相对应的常见函数。

● 发送旌旗灯号的函数:kill()、raise()。

● 捕捉旌旗灯号的函数:alarm()、pause()。

● 处置惩罚旌旗灯号的函数:signal()、sigacTIon()。

您可能还会对下面的文章感兴趣: