나는 팔로우하고 있다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_ALARM
proc 마스크에서 제거됩니다.pr_mask("finishing sig_usr1: ");
이는 에서 호출이 이루어질 때 설명 됩니다sig_usr1()
.
전화할 때 SIG_ALARM
차단되는 것을 방지하는 방법은 무엇입니까? 이전 마스크는 이 통화 이후에 발생하는 통화 시에만 복원되어야 합니다.pr_mask("finishing sig_usr1")
siglongjump()
siglongjump()