리눅스

Alarm Clock - 유닉스 계열에서 alarm signal 설정

macro 2010. 4. 2. 09:41
반응형

리눅스, 유닉스에서 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);
}
반응형