Linux下的信号机制 |
|||||||||||||||||||||||||||||||||
本文关键字: linux 管道通信,linux 进程通信方式,信号 信号是在软件层次上对中断机制的一种模拟。在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。信号是异步的,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到底什么时候到达。信号可以直接进行用户空间进程和内核进程之间的交互,内核进程也可以利用它来通知用户空间进程发生了哪些系统事件。它可以在任何时候发给某一进程,而无须知道该进程的状态。如果该进程当前并未处于执行态,则该信号就由内核保存起来,直到该进程恢复执行再传递给它为止;如果一个信号被进程设置为阻塞,则该信号的传递被延迟,直到其阻塞被取消时才被传递给进程。 信号是进程间通信机制中唯一的异步通信机制,可以看做是异步通知,通知接收信号的进程有哪些事情发生了。信号机制经过Posix实时扩展后,功能更加强大,除了基本通知功能外,还可以传递附加信息。 信号事件的发生有两个来源:硬件来源(如我们按下了键盘上的按钮或者出现其他硬件故障);软件来源,常用发送信号的系统函数有kill()、raise()、alarm()、setitimer()和sigqueue()等,软件来源还包括一些非法运算等操作。 进程可以通过3种方式来响应一个信号。 1.忽略信号 忽略信号即对信号不做任何处理,其中,有两个信号不能忽略:SIGKILL和SIGSTOP。 2.捕捉信号 定义信号处理函数,当信号发生时,执行相应的处理函数。 3.执行默认操作 Linux对每种信号都规定了默认操作,如表1所示。 表1 常见信号的含义及其默认操作
一个完整的信号生命周期可以分为3个重要阶段,这3个阶段由4个重要事件来刻画的:信号产生、信号在进程中注册、信号在进程中注销、执行信号处理函数。这里信号的产生、注册、注销等是指信号的内部实现机制,而不是信号的函数实现。因此,信号注册与否与本节后面讲到的发送信号函数(如kill()等)及信号安装函数(如signal()等)无关,只与信号值有关。 相邻两个事件的时间间隔构成信号生命周期的一个阶段。要注意这里的信号处理有多种方式,一般是由内核完成的,当然也可以由用户进程来完成,故在此没有明确指出。 信号的处理包括信号的发送、捕获及信号的处理,它们有各自相对应的常见函数。 ● 处理信号的函数:signal()、sigaction()。 本文选自华清远见嵌入式培训教材《从实践中学嵌入式Linux应用程序开发》 热点链接:
1、有名管道(FIFO) |