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()

관련 정보