CnUnix

[알림판목록 I] [알림판목록 II] [글목록][이 전][다 음]
[ CnUnix ] in KIDS
글 쓴 이(By): jewel (그냥! 보석�x)
날 짜 (Date): 1995년09월19일(화) 13시32분29초 KDT
제 목(Title): setitimer사용법(예제)


안녕하세요..
timer를 사용해서 프로그램 해야할 때가 종종 생기는데,
아주 쉽게 사용하실 수 있습니다.

일단 간단하게 설명드리면,,
timer를 사용하시기전에 
    signal(SIGALRM, handler);
함수를 불러줍니다.
그러면 setitimer에서 명시한 시간이 지나면 SIGALRM이 뜨고,
이 SIGALRM이 뜨면 등록한 handler로 call이 옵니다.
일종의 timer callback이라고 생각하시면 됩니다.

원하는 시간이 지나면 SIGALAM이 뜨게 하는 함수는
    setitimer(ITIMER_REAL, &itimer,
                     (struct itimerval *)0);
입니다.
첫번째 인자는 사용하는 시간의 종류, 
두번째 인자는 timer가 expire될 시간.
그리고 세번째는 이전에 설정된 timer가 있을때 남은 시간이 기록됩니다.
세번째는 그냥 NULL로 하시면 됩니다.

그리고 time out이 되어서 handler가 불려지면 또 다시
setitimer를 불러서 다음 timerout 시간을 설정해야

계속 제어를 받을 수 있습니다.

좀 설명이 난해하군요..:)
다음은 예제입니다.
이걸 한번 돌려보시면 이해가 되실듯..

#include <signal.h>
#include <sys/time.h>
#include <unistd.h>

int     val=40000;
void    handler();
main()
{
    signal(SIGALRM, handler);
    set_timer();
    for(;;)
      ;
}
void handler()
{
    printf("Timer Expired [%d]\n", val);
    set_timer();

}
set_timer()
{
    struct itimerval itimer;
    itimer.it_interval.tv_sec = 0;

    itimer.it_interval.tv_usec = 0;
    itimer.it_value.tv_sec = 0;
    itimer.it_value.tv_usec = val;
    setitimer(ITIMER_REAL, &itimer,
                     (struct itimerval *)0);
}

OS에 따라서 한번만 불려지고, error가 발생할 수도 있는데
그때는 signal() 부분을 setitimer를 설정할때 
같이 하면 됩니다.
그럼 이만..

보석..
[알림판목록 I] [알림판목록 II] [글 목록][이 전][다 음]
키 즈 는 열 린 사 람 들 의 모 임 입 니 다.