출처 :Advanced Programming in the UNIX® Environment: Second Edition
typedef void Sigfunc(int); /* for signal handlers */
static Sigfunc *_Signal(int signo, Sigfunc *func);
static Sigfunc *_Signal_Intr(int signo, Sigfunc *func);
/*
* Reliable version of signal(), using POSIX sigaction().
*/
static Sigfunc *_Signal(int signo, Sigfunc *func)
{
    struct sigaction    act, oact;
    act.sa_handler = func;
    sigemptyset(&act.sa_mask);
    act.sa_flags = 0;
if (signo == SIGALRM) {
        #ifdef SA_INTERRUPT
            act.sa_flags |= SA_INTERRUPT;
        #endif
    }
    else {
        #ifdef  SA_RESTART
            act.sa_flags |= SA_RESTART;
        #endif
}
    if (sigaction(signo, &act, &oact) < 0) {
        return(SIG_ERR);
    }
return(oact.sa_handler);
}
/*
* a version of the signal function that tries to
* prevent any interrupted system calls from being restarted.
*/
static Sigfunc *_Signal_Intr(int signo, Sigfunc *func)
{
    struct sigaction    act, oact;
    act.sa_handler = func;
    sigemptyset(&act.sa_mask);
    act.sa_flags = 0;
#ifdef SA_INTERRUPT
act.sa_flags |= SA_INTERRUPT;
#endif
    if (sigaction(signo, &act, &oact) < 0) {
        return(SIG_ERR);
    }
return(oact.sa_handler);
}
http://revoman.tistory.com/122










