Linux的信号机制

https://www.jianshu.com/p/f445bfeea40a

信号的处理:
信号的处理有三种方法,分别是:忽略、捕捉和默认动作

信号处理函数的注册

信号处理函数的注册不只一种方法,分为入门版和高级版

  1. 入门版:函数signal
  2. 高级版:函数sigaction

信号处理发送函数

信号发送函数也不止一个,同样分为入门版和高级版
1.入门版:kill
2.高级版:sigqueue

 

可靠信号和不可靠信号

不可靠信号:信号可能会丢失,一旦信号丢失了,进程并不能知道信号丢失
可靠信号:也是阻塞信号,当发送了一个阻塞信号,并且该信号的动作时系统默认动作或捕捉该信号,如果信号从发出以后会一直保持未决的状态,直到该进程对此信号解除了阻塞,或将对此信号的动作更改为忽略。
对于信号来说,信号编号小于等于31的信号都是不可靠信号,之后的信号为可卡信号,系统会根据有信号队列,将信号在递达之前进行阻塞。

信号的阻塞和未决是通过信号的状态字来管理的,该状态字是按位来管理信号的状态。每个信号都有独立的阻塞字,规定了当前要阻塞地达到该进程的信号集。

信号阻塞状态字(block),1代表阻塞、0代表不阻塞;信号未决状态字(pending)的1代表未决,0代表信号可以抵达了;它们都是每一个bit代表一个信号

  • 阻塞和未决是如何工作的?
    比如向进程发送SIGINT信号,内核首先会判断该进程的信号阻塞状态字是否阻塞状态,如果该信号被设置为阻塞的状态,也就是阻塞状态字对应位为1,那么信号未决状态字(pending)相应位会被内核设置为1;如果该信号阻塞解除了,也就是阻塞状态字设置为了0,那么信号未决状态字(pending)相应位会被内核设置为0,表示信号此时可以抵达了,也就是可以接收该信号了。
    阻塞状态字用户可以读写,未决状态字用户只能读,是由内核来设置表示信号递达状态的。
    PS:这里额外说明以下,只有支持了 POSIX.1实时扩展的系统才支持排队的功能(也就阻塞状态下多次同一信号发送给某一进程可以得到多次,而不是一次)。

  • 关于进程关于信号的阻塞状态字的设置
    可以通过int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);函数来获取或者设置。


二、信号实现定时器

  1.  alarm和pause实现定时:https://www.cnblogs.com/yxk529188712/p/4982401.html
  2. settimers实现定时:https://www.cnblogs.com/dandingyy/archive/2012/08/23/2653218.html
  3. 信号的讲解:https://blog.csdn.net/lemontree1945/article/details/82664802

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值