signalとか
ついさっきまでsignalはプロセスのルートスレッド(?)を止めてハンドラを起動するしかないと思ってたけど、いろいろ調べるとsigwaitを使ってsignalを別スレッドに丸投げ出来るらしいと知った。
main()で書くのはこういうコード
... sigset_t sig_set; sigemptyset( &sig_set ); sigaddset( &sig_set, SIGTERM ); sigaddset( &sig_set, SIGHUP ); sigprocmask( SIG_BLOCK, &signals_set, 0 ); ...
このsig_setをスレッドの引数として渡してやれば、スレッド側で
...
int sig;
sigwait( &sig_set, &sig );
...
とするとsigに受け取ったシグナルが格納されて0が返ってくる。
sigwaitはpthreadのキャンセルポイントにもなってるので、ハンドラのスレッドをキャンセルすれば非0が返るということらしい。