반응형

 

http://macro.tistory.com/105

 


리눅스, 유닉스에서 SIGALRM 을 설정하여 테스트를 해 봤는데, 리눅스에서는 signal함수가 잘 되었지만, 유닉스에서는 Alarm Clock 이라는 메시지가 나오면서 클락이 죽어버리고 프로그램이 종료되었다.
아래는 모든 유닉스계열에서 잘 돌아가도록 만들어진, UNP 책에 나온 시그널 함수다. 특히 SIGALRM을 전처리기를 이용하여 처리되도록 되었고, 리눅스, HP, SUN, AIX 테스트 해본 결과 이상없었다.

#include<signal.h>

void (*signal(int signo, void (*func)(int)))(int);
typedef void Sigfunc(int);
Sigfunc *Signal(int signo, Sigfunc *func);

 

-------------------------------------


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, &amp;oact) < 0)
        return (SIG_ERR);


    return (oact.sa_handler);
}

반응형
Posted by 공간사랑
,