私はフォローしています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()