にゃははー

はへらー

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が返るということらしい。