关于操作系统的信号,一直是比较难于理解容易出错的地方
关于可靠信号与不可靠信号,网络上大部分文章相互抄袭,都是错的
本文在深度参考了APUE和TLPI,试图说清楚这两者的差异
一· 可靠信号与不可靠信号
早期的signal函数
- 在首次注册前没有办法使用屏蔽字让信号保持未决,此信号也容易丢失
- 在每次信号处理时都会重置信号处理函数,所以需要在信号处理函数中重新注册一次,处理中注册前产生的信号会丢失
以上情况就是不可靠信号
后期使用sigprocmask函数和sigaction,从而保证信号不会丢失
二· 非排队信号与排队信号
信号产生就一定要保证通知到进程,这就是可靠信号
- 累计产生多次只通知一次,也是可靠的
- 如果每产生一次就能够通知一次,这就是排队信号(参考sigqueue)
三· 通用信号与实时信号
- 通用信号值使用一个信号屏蔽位提示有没有信号产生,所以是不能排队的
- 实时信号是SIGRTMIN~SIGRTMAX之间的信号,标准对实时信号是否排队没有要求,linux对实时信号是排队的
误区
误区一 不能排队的信号就是不可靠信号,错!信号有没有准确达到才是可靠与否的判断标准
误区二 实时信号都是可靠的,错!标准没有这一说法,网上很多文章将不可靠信号等同于通用信号,将可靠信号等同于实时信号,明显是错误的
误区三 signal函数是不可靠的,错!早期的signal实现有不可靠的问题,现在几乎所有的unix系统都是使用sigaction来实现signal的,所以,已经能可靠的处理信号了
标签:函数,signal,排队,实时,可靠,信号,文章 From: https://www.cnblogs.com/fromdtor/p/17877598.html