本文对Linux中不可靠信号丢失问题做一些初步的探讨,如果有误,还请各位大佬指正!
Linux中的不可靠信号存在着可能丢失的问题:
先看以下下面的例子
- 信号的嵌套处理方式
假如一个进程接收到了一个A信号,然后去相应的信号处理函数里面处理信号,处理信号期间,又来了一个信号B,那么如果信号A的处理函数是通过signal系统调用注册的,信号B会打断此时正在进行的信号A的处理函数,转去处理信号B的处理函数;这和中断嵌套很像
但是通常情况下,我们并不希望这种嵌套处理的方式,试想一下;如果信号B的处理函数行为是终止进程,那么信号A的处理函数正在处理,然后B信号来了,进程关闭了,A信号的处理函数没有完成应该要完成的工作,这在某些情况下是很致命的,所以我们通常不会使用这种嵌套处理信号的方式
- 信号的阻塞等待处理方式
如果信号处理函数是通过sa_sigaction系统调用注册的,那还是上述例子,信号A在处理期间,如果信号B来了,并且信号B包含在sa_sigaction注册信号A的时候,参数指定的信号掩码中,那么信号B将会被阻塞,等待信号A处理完毕之后,才会处理信号B
- 信号丢失
如果在信号B阻塞期间,又传来了一个信号B,由于sa_sigaction的信号掩码参数是集合类型的变量,无法重复元素,因此又来的这个信号B将会丢失,这就是所谓的信号丢失!