非同期シグナルを同期的に扱う

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選