我正在关注APUE教科书siglongjump()
,还有这个一段代码这让我很困惑。
pr_mask()
只是一个打印被屏蔽信号的函数。- 据此,如果
USR1
信号到来,它将被添加到进程掩码中,这就是处理程序。static void sig_usr1(int signo) { time_t starttime; if (canjump == 0) return; /* unexpected signal, ignore */ pr_mask("starting sig_usr1: "); alarm(3); /* SIGALRM in 3 seconds */ starttime = time(NULL); for ( ; ; ) /* busy wait for 5 seconds */ if (time(NULL) > starttime + 5) break; pr_mask("finishing sig_usr1: "); canjump = 0; siglongjmp(jmpbuf, 1); /* jump back to main, don't return */ }
- 现在,当
USR1
正在处理时SIG_ALARM
,它会调用处理程序
这static void sig_alrm(int signo) { pr_mask("in sig_alrm: "); }
SIG_ALARM
也将被添加到过程掩码中。然而,当sig_alarm()
完成后,thenSIG_ALARM
将从 proc mask 中删除。当pr_mask("finishing sig_usr1: ");
在 中进行调用时就说明了这一点sig_usr1()
。
调用时如何SIG_ALARM
不被屏蔽?应该只在调用时恢复旧掩码,这发生在这次调用之后。pr_mask("finishing sig_usr1")
siglongjump()
siglongjump()