Linux信号处理机制

来源:
导读 大家好,我是本期栏目编辑小友,现在为大家讲解Linux信号处理机制问题。 信号处理是进程之间唯一的异步通信方式。 一、信号和信号源。

大家好,我是本期栏目编辑小友,现在为大家讲解Linux信号处理机制问题。

信号处理是进程之间唯一的异步通信方式。

一、信号和信号源。

信号本质

信号是软件级中断机制的模拟。原则上,进程接收信号,处理器接收中断请求,这可以说是相同的。信号是异步的,一个进程不需要等待信号通过任何操作到达。事实上,这个过程不知道信号什么时候会到达。

信号是进程间通信机制中唯一的异步通信机制,可以看作是异步通知,通知接收信号的进程发生了什么。经过POSIX实时扩展,信号机制更加强大。除了基本的通知功能,它还可以传输附加信息。

信号源

信号有两个来源:硬件来源(比如我们按了键盘或者其他硬件故障);软件来源,最常用的发送信号的系统功能有kill、raise、alarm、seTITImer和sigqueue功能,软件来源还包括一些非法操作。

第二,信号的类型。

信号可以从两个不同的分类角度进行分类:(1)可靠性:可靠信号和不可靠信号;(2)与时间的关系:实时信号和非实时信号。系统支持的所有信号列于《Linux环境进程间通信(一):管道及有名管道》的附录1。

1、信号可靠和信号不可靠。

“信号不可靠”

Linux信令机制基本上是从Unix系统继承而来的。早期的Unix系统中的信号机制比较简单原始,但后来在实践中暴露出一些问题。因此,基于早期机制的信号称为“不可靠信号”,信号值小于sigrtmin的信号(在Red Hat 7.2中,SIGRTMIN=32,SIGRTMAX=63)都是不可靠信号。这就是‘不可靠信号’的来源。它的主要问题是:

每当进程处理一个信号时,它都会将对该信号的响应设置为默认操作。在某些情况下,它会导致错误的信号处理。因此,如果用户不希望这样的操作,他应该在信号处理功能结束时再次调用signal()来重新安装信号。

信号可能会丢失,这将在后面详细解释。

所以早期unix中的不可靠信号主要是指进程可能对信号做出错误的响应,信号可能丢失。

Linux支持不可靠信号,但对不可靠信号机做了改进:调用信号处理函数后,不需要再调用信号安装函数(信号安装函数是在可靠的机制上实现的)。所以Linux下信号不可靠的问题主要是指信号可能丢失的问题。

'可靠信号'

随着时间的发展,实践证明,有必要对原有的信号机制进行改进和扩展。因此,后来的各种Unix版本都分别研究了这方面,试图实现“可靠信号”。由于最初定义的信号已经在许多应用中使用,很难再做进一步的更改,因此我们必须添加一些新的信号,并在开始时将其定义为可靠的信号。这些信号支持排队,不会丢失。同时还有信号传输和安装的新版本:信号传输功能sigqueue()和信号安装功能sigacTIon()。POSIX.4规范了可靠信号机的制造。但是,POSIX只是标准化了一个可靠的信号机制应该具备的功能和信号机制的外部接口,并没有规定信号机制的实现。

SIGRTMIN和SIGRTMAX之间取值的信号是可靠信号,可靠信号克服了信号可能丢失的问题。在Linux支持新版sigaTIon()和sigqueue()的同时,仍然支持早期的signal()信号安装功能和信号传输功能kill()。

注意:不要误会sigqueue()发送的信号和sigaction安装的信号是可靠的。实际上,可靠信号是指后来加入的新信号(信号值在SIGRTMIN和SIGRTMAX之间);不可靠信号是指信号值小于SIGRTMIN的信号。信号的可靠性和不可靠性只与信号值有关,与信号传输和安装功能无关。目前linux中的sigation()函数实现了sigation()函数,所以即使是sigation()函数安装的信号,也不需要在信号处理函数结束时再次调用信号安装函数。同时signal()安装的实时信号支持排队,不会丢失。

目前的两个linux信号安装功能,signal()和sigaction(),都不能把SIGRTMIN之前的信号变成可靠的信号(不支持排队,可能还会丢失,还是不可靠的信号),都支持SIGRTMIN之后的信号排队。这两种功能最大的区别是sigination安装的信号可以向信号处理功能传输信息(所有信号都是如此),而sigination安装的信号不能向信号处理功能传输信息。信号功能也是如此。

信号处理是进程之间唯一的异步通信方式。

一、信号和信号源。

信号本质

信号是软件级中断机制的模拟。原则上,进程接收信号,处理器接收中断请求,这可以说是相同的。信号是异步的,一个进程不需要等待信号通过任何操作到达。

,事实上,进程也不知道信号到底什么时候到达。

  信号是进程间通信机制中唯一的异步通信机制,可以看作是异步通知,通知接收信号的进程有哪些事情发生了。信号机制经过POSIX实时扩展后,功能更加强大,除了基本通知功能外,还可以传递附加信息。

  信号来源

  信号事件的发生有两个来源:硬件来源(比如我们按下了键盘或者其它硬件故障);软件来源,最常用发送信号的系统函数是kill, raise, alarm和seTITImer以及sigqueue函数,软件来源还包括一些非法运算等操作。

  二、信号的种类

  可以从两个不同的分类角度对信号进行分类:(1)可靠性方面:可靠信号与不可靠信号;(2)与时间的关系上:实时信号与非实时信号。在《Linux环境进程间通信(一):管道及有名管道》的附1中列出了系统所支持的所有信号。

  1、可靠信号与不可靠信号

  "不可靠信号"

  Linux信号机制基本上是从Unix系统中继承过来的。早期Unix系统中的信号机制比较简单和原始,后来在实践中暴露出一些问题,因此,把那些建立在早期机制上的信号叫做"不可靠信号",信号值小于SIGRTMIN(Red hat7.2中,SIGRTMIN=32,SIGRTMAX=63)的信号都是不可靠信号。这就是"不可靠信号"的来源。它的主要问题是:

  进程每次处理信号后,就将对信号的响应设置为默认动作。在某些情况下,将导致对信号的错误处理;因此,用户如果不希望这样的操作,那么就要在信号处理函数结尾再一次调用signal(),重新安装该信号。

  信号可能丢失,后面将对此详细阐述。

  因此,早期unix下的不可靠信号主要指的是进程可能对信号做出错误的反应以及信号可能丢失。

  Linux支持不可靠信号,但是对不可靠信号机制做了改进:在调用完信号处理函数后,不必重新调用该信号的安装函数(信号安装函数是在可靠机制上的实现)。因此,Linux下的不可靠信号问题主要指的是信号可能丢失。

  "可靠信号"

  随着时间的发展,实践证明了有必要对信号的原始机制加以改进和扩充。所以,后来出现的各种Unix版本分别在这方面进行了研究,力图实现"可靠信号"。由于原来定义的信号已有许多应用,不好再做改动,最终只好又新增加了一些信号,并在一开始就把它们定义为可靠信号,这些信号支持排队,不会丢失。同时,信号的发送和安装也出现了新版本:信号发送函数sigqueue()及信号安装函数sigacTIon()。POSIX.4对可靠信号机制做了标准化。但是,POSIX只对可靠信号机制应具有的功能以及信号机制的对外接口做了标准化,对信号机制的实现没有作具体的规定。

  信号值位于SIGRTMIN和SIGRTMAX之间的信号都是可靠信号,可靠信号克服了信号可能丢失的问题。Linux在支持新版本的信号安装函数sigaTIon()以及信号发送函数sigqueue()的同时,仍然支持早期的signal()信号安装函数,支持信号发送函数kill()。

  注:不要有这样的误解:由sigqueue()发送、sigaction安装的信号就是可靠的。事实上,可靠信号是指后来添加的新信号(信号值位于SIGRTMIN及SIGRTMAX之间);不可靠信号是信号值小于SIGRTMIN的信号。信号的可靠与不可靠只与信号值有关,与信号的发送及安装函数无关。目前linux中的signal()是通过sigation()函数实现的,因此,即使通过signal()安装的信号,在信号处理函数的结尾也不必再调用一次信号安装函数。同时,由signal()安装的实时信号支持排队,同样不会丢失。

  对于目前linux的两个信号安装函数:signal()及sigaction()来说,它们都不能把SIGRTMIN以前的信号变成可靠信号(都不支持排队,仍有可能丢失,仍然是不可靠信号),而且对SIGRTMIN以后的信号都支持排队。这两个函数的最大区别在于,经过sigaction安装的信号都能传递信息给信号处理函数(对所有信号这一点都成立),而经过signal安装的信号却不能向信号处理函数传递信息。对于信号发送函数来说也是一样的.

   技术专区 睿赛德科技喜迁新址 ,RT-Thread进入新的加速发展阶段 可靠性高、控制灵活、低功耗可调速风扇散热系统 安防监控摄像头LED驱动解决方案 如何定制嵌入式Linux发行版 基于SoC实现的数据采集系统详解

标签:

版权声明:转载此文是出于传递更多信息之目的。若有来源标注错误或侵犯了您的合法权益,请作者持权属证明与本网联系,我们将及时更正、删除,谢谢您的支持与理解。