我正在用户空间中开发自己的信号处理机制。当浏览内核代码并执行一些 C 代码时。我意识到,
场景 1:当我的代码在收到信号后执行信号处理程序时,假设遇到了不同类型的新信号(这个新信号也被处理),则调用新信号信号处理程序(SH2)来保存已经执行信号处理程序(SH1)。一旦 SH2 完成,SH1 又从它离开的地方开始执行。
场景 2:我注册了四个信号 SIGINT、SIGUSR2、SIGHUP 的处理程序。然后,我阻止了所有这些信号,并使用终端的“kill”命令生成这些信号。之后我再次解锁了这些信号。我观察到的是,这些信号是按顺序传递的,它们的处理程序是按顺序执行的。
那么信号处理程序何时顺序执行以及何时级联。
我浏览了内核源码:
- 当生成信号时,它会被添加到挂起列表中,并设置 TIF_SIGPENDING 标志。在调度定时器中断时,会检查此标志(我对此不确定),这会导致 do_signal() 的执行,该 do_signal() 会使信号出列并重新计算 TIF_SIGPENDING 标志。如果挂起列表中有更多信号,则再次设置此标志。
如果现在调度程序计时器到期,将调用新的信号处理程序(导致信号处理程序级联)那么在某些情况下信号处理程序如何顺序执行?