siglongjmp 如何与多个信号处理程序一起工作

siglongjmp 如何与多个信号处理程序一起工作

我正在关注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()

相关内容