linux信号机制远远比想象复杂本文力争用最短篇幅对该机制做了深入细致分析信号应用实例将在信号(下)中给出
=atitle2>、信号及信号来源
信号本质
信号是在软件层次上对中断机制种模拟在原理上个进程收到个信号与处理器收到个中断请求可以说是样信号是异步个进程不必通过任何操作来等待信号到达事实上进程也不知道信号到底什么时候到达
信号是进程间通信机制中唯异步通信机制可以看作是异步通知通知接收信号进程有哪些事情发生了信号机制经过POSIX实时扩展后功能更加强大除了基本通知功能外还可以传递附加信息
信号来源
信号事件发生有两个来源:硬件来源(比如我们按下了键盘或者其它硬件故障);软件来源最常用发送信号系统是kill, raise, alarm和itimer以及sigqueue软件来源还包括些非法运算等操作
=atitle2>二、信号种类
可以从两个不同分类角度对信号进行分类:(1)可靠性方面:可靠信号与不可靠信号;(2)与时间关系上:实时信号与非实时信号在Linux环境进程间通信():管道及有名管道附1中列出了系统所支持所有信号
=atitle3>1、可靠信号与不可靠信号
"不可靠信号"
Linux信号机制基本上是从Unix系统中继承过来早期Unix系统中信号机制比较简单和原始后来在实践中暴露出些问题因此把那些建立在早期机制上信号叫做"不可靠信号"信号值小于SIGRTMIN(Red hat 7.2中SIGRTMIN=32SIGRTMAX=63)信号都是不可靠信号这就是"不可靠信号"来源它主要问题是:
oOjfbaiducukI1j因此早期unix下不可靠信号主要指是进程可能对信号做出反应以及信号可能丢失
Linux支持不可靠信号但是对不可靠信号机制做了改进:在完信号处理后不必重新该信号安装(信号安装是在可靠机制上实现)因此Linux下不可靠信号问题主要指是信号可能丢失
"可靠信号"
随着时间发展实践证明了有必要对信号原始机制加以改进和扩充所以后来出现各种Unix版本分别在这方面进行了研究力图实现"可靠信号"由于原来定义信号已有许多应用不好再做改动最终只好又新增加了些信号并在开始就把它们定义为可靠信号这些信号支持排队不会丢失同时信号发送和安装也出现了新版本:信号发送sigqueue及信号安装sigactionPOSIX.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安装信号却不能向信号处理传递信息对于信号发送来说也是样
=atitle3>2、实时信号与非实时信号
早期Unix系统只定义了32种信号Ret hat7.2支持64种信号编号0-63(SIGRTMIN=31SIGRTMAX=63)将来可能进步增加这需要得到内核支持前32种信号已经有了预定义值每个信号有了确定用途及含义并且每种信号都有各自缺省动作如按键盘CTRL ^C时会产生SIGINT信号对该信号默认反应就是进程终止后32个信号表示实时信号等同于前面阐述可靠信号这保证了发送多个实时信号都被接收实时信号是POSIX标准部分可用于应用进程
非实时信号都不支持排队都是不可靠信号;实时信号都支持排队都是可靠信号
=atitle2>三、进程对信号响应
进程可以通过三种方式来响应个信号:(1)忽略信号即对信号不做任何处理其中有两个信号不能忽略:SIGKILL及SIGSTOP;(2)捕捉信号定义信号处理当信号发生时执行相应处理;(3)执行缺省操作Linux对每种信号都规定了默认操作详细情况请参考[2]以及其它资料注意进程对实时信号缺省反应是进程终止
Linux究竟采用上述三种方式哪个来响应信号取决于传递给相应API参数
=atitle2>四、信号发送
发送信号主要有:kill、raise、 sigqueue、alarm、itimer以及abort
1、kill
oOjfbaiducukI1j# <sys/types.h>
oOjfbaiducukI1j# <signal.h>
oOjfbaiducukI1j kill(pid_t pid, signo)
oOjfbaiducukI1j
参数pid值
延伸阅读发表评论 |
最新评论