假设我为和main
注册了 2 个信号处理程序,比方说和。当运行时信号到达时会发生什么?SIGUSR1
SIGUR2
sig_ur1
sig_ur2
SIGUR2
sig_ur1
sig_ur1
运行 ----> 信号SIGUR2
到达 ----> :
sig_ur1
继续运行->sig_ur1
完成->sig_ur2
开始运行->sig_ur2
完成->返回main
sig_ur2
开始运行->sig_ur2
结束->返回main
sig_ur2
开始运行 ->sig_ur2
结束 ->恢复(变量在离开sig_ur1
时保持相同的值) ->结束 -> 返回sig_ur1
sig_ur1
main
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。