不可靠的信号、可靠信号

一、不可靠信号

lnux信号机制基本上是从UNIX系统中继承过来的。早期UNIX系统中的信号机制比较简单和原始,后来在实践中暴露一些问题,它的主要问题是:

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

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

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

 

二、不可靠信号的发展

随着时间的发展,实践证明了有必要对信号的原始机制加以改进和扩充。所以,后来出现的各种UNIX版本分别在这方面进行了研究,力图实现"可靠信号"。由于原来定义的信号已经有许多应用,不好再做改动,最终只好又新增加了一些信号,并在一开始就把它们定义为可靠信号,这些信号支持排队,不会丢失。

同时,信号的发送和安装也出现了新版本:发送函数sigqueue()及信号安装函数sigaction()。

早期UNIX系统只定义了32种信号,Ret hat7.2支持64种信号,编号0-63(SIGRTMIN = 31, SIGRTMAX = 63),将来可能进一步增加,这需要得到内核的支持。前32种信号已经有了预定义值,每个信号有了确定的用途和定义,并且每种信号都有各自缺省动作。如按键盘CTRL + C时,会产生SIGINT信号,对该信号的默认反应就是进程终止。后32个信号表示实时信号,等同前面阐述的可靠信号。这保证了发送的多个实时信号都被接收,实时信号是POSIX标准的一部分,可用于应用进程。

非实时信号都不支持排队,都是不可靠信号;实时信号都支持排队,都是可靠信号。

 

三、可靠信号术语和语义

执行信号的处理动作称作为递达(Delivery),信号从产生到递达之间的状态,称之为信号未决(Pending),进程可以选择阻塞(Block)某个信号。被阻塞的信号产生时将保持在未决状态,直到进程解除对信号的阻塞,才执行递达的动作。注意,阻塞和忽略是不同的,只要信号被阻塞就不会递达,而忽略信号是在递达之后可选的一种处理动作。信号在内核中的表示可以看作是这样的

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值