리눅스, 유닉스에서 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, &oact) < 0)
return (SIG_ERR);
return (oact.sa_handler);
}