非同期シグナルを同期的に扱う
sigwaitを利用して、シグナル受信スレッドを作成してしまおうというのがアイディア。
#include <pthread.h> #include <sys/time.h> #include <sys/select.h> #include <signal.h> #include <stdio.h> void *wait_for_sighup(void *dmy) { int sig; //sig_wait関数はSIGHUPを待つ sigset_t ss; sigemptyset(&ss); sigaddset(&ss, SIGHUP); while(1) { //SIGHUPを待つ if(sigwait(&ss, &sig) == 0) { switch(sig) { case SIGHUP: printf("Hello async-signal-safe world!\n"); break; } } } return NULL; } int main(void) { sigset_t ss; pthread_t pt; pthread_attr_t atr; //SIGHUPをマスクする(SIGHUPが起こされても保留状態にする) sigemptyset(&ss); sigaddset(&ss, SIGHUP); sigprocmask(SIG_BLOCK, &ss, NULL); //SIGHUPを処理する専用スレッドを生成 pthread_attr_init(&atr); pthread_attr_setdetachstate(&atr, PTHREAD_CREATE_DETACHED); pthread_create(&pt, &atr, wait_for_sighup, NULL); while(1); return 0; }
■参考文献
Binary Hacks――ハッカー秘伝のテクニック100選