当一个信号处理程序被另一个信号处理程序中断时,两个(≥2)信号处理程序的执行顺序?

当一个信号处理程序被另一个信号处理程序中断时,两个(≥2)信号处理程序的执行顺序?

假设我为和main注册了 2 个信号处理程序,比方说和。当运行时信号到达时会发生什么?SIGUSR1SIGUR2sig_ur1sig_ur2SIGUR2sig_ur1

sig_ur1运行 ----> 信号SIGUR2到达 ----> :

  1. sig_ur1继续运行->sig_ur1完成->sig_ur2开始运行->sig_ur2完成->返回main

  2. sig_ur2开始运行->sig_ur2结束->返回main

  3. sig_ur2开始运行 ->sig_ur2结束 ->恢复(变量在离开sig_ur1时保持相同的值) ->结束 -> 返回sig_ur1sig_ur1main

  4. sig_ur2开始运行 ->sig_ur2结束 ->sig_ur1重新启动(所有变量再次初始化) ->sig_ur1结束 -> 返回main

哪一个选项是正确的?或者两者都不正确?我没有找到任何讨论此问题的文章/帖子,因此,提供任何相关材料/链接将不胜感激。 :)

答案1

默认情况下会发生场景 3。但是,您可以在运行 SIGUSR1 的处理程序时阻止 SIGUSR2,因此会发生场景 1。当您安装信号处理程序时,您可以指定在运行该信号处理程序时要阻止哪些信号。

作为参考,我建议您阅读操作系统有关信号的手册页。例如,在 Linux 上,您可以从man 7 signal那里开始参见“另请参见”手册页。

然而,您可以轻松地自己检查行为:只需为 SIGUSR1 创建一个进入长时间睡眠(3)的处理程序(在 Linux 中更好的 nanosleep(2),因为睡眠(3)可能通过 SIGALRM 实现),然后首先发送 SIGUSR1 和然后是 SIGUSR2。

相关内容