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()完了するとSIG_ALARMproc マスクから削除されます。pr_mask("finishing sig_usr1: ");これは、呼び出しが行われたときに説明されますsig_usr1()

電話でSIG_ALARMブロックされるのを防ぐ方法は?前のマスクは、この通話後に発生した通話時にのみ復元する必要があります。pr_mask("finishing sig_usr1")siglongjump()siglongjump()

関連情報