可靠信号与不可靠信号,大部分文章都是错误的

发布时间 2023-12-05 16:42:45作者: fromdtor
关于操作系统的信号,一直是比较难于理解容易出错的地方
关于可靠信号与不可靠信号,网络上大部分文章相互抄袭,都是错的
本文在深度参考了APUE和TLPI,试图说清楚这两者的差异 

一· 可靠信号与不可靠信号

早期的signal函数

  1. 在首次注册前没有办法使用屏蔽字让信号保持未决,此信号也容易丢失
  2. 在每次信号处理时都会重置信号处理函数,所以需要在信号处理函数中重新注册一次,处理中注册前产生的信号会丢失

以上情况就是不可靠信号

后期使用sigprocmask函数和sigaction,从而保证信号不会丢失

二· 非排队信号与排队信号

信号产生就一定要保证通知到进程,这就是可靠信号

  1. 累计产生多次只通知一次,也是可靠的
  2. 如果每产生一次就能够通知一次,这就是排队信号(参考sigqueue)

三· 通用信号与实时信号

  1. 通用信号值使用一个信号屏蔽位提示有没有信号产生,所以是不能排队的
  2. 实时信号是SIGRTMIN~SIGRTMAX之间的信号,标准对实时信号是否排队没有要求,linux对实时信号是排队的

误区

误区一 不能排队的信号就是不可靠信号,错!信号有没有准确达到才是可靠与否的判断标准

误区二 实时信号都是可靠的,错!标准没有这一说法,网上很多文章将不可靠信号等同于通用信号,将可靠信号等同于实时信号,明显是错误的

误区三 signal函数是不可靠的,错!早期的signal实现有不可靠的问题,现在几乎所有的unix系统都是使用sigaction来实现signal的,所以,已经能可靠的处理信号了