리눅스 타이머 프로그래밍

반응형

timer_settime()

타이머를 시작하거나 중지한다.

 

해당 함수의 원형은 다음과 같다.

#include <time.h>

int timer_settime(timer_t timerid, 
                  int flags, 
                  const struct itimerspec *new_value, 
                  struct ittimerspec *old_value);

 

timerid로 식별되는 타이머를 시작하거나 중지한다. timerid는 timer_create()를 통해 생성된 timer 식별자이다.

함수 호출자는 타이머 첫 만기 시점 및 반복주기를 new_value에 설정해야 한다.

 

ittimerspec 구조체의 형식은 다음과 같다.

struct timespec 
{
  time_t tv_sec; // 초값
  long tv_nsec; // 나노초값
}

struct itimerspec 
{
  struct timespec it_interval; // 타이머 주기
  struct timespec it_value;    // 첫 만기 시점
}

 

new_value->it_value는 첫 만기 시점을 설정한다.

  • 0이 아닐 경우: 타이머가 시작되고 it_value에 설정된 시점에 만기된다. 만약 타이머가 이미 동작 중이면 기존 설정을 엎어쓴다.
  • 0일 경우: 타이머가 해제(중지)된다.

 

new_value->it_interval는 타이머의 반복 주기를 설정한다. 

  • 0이 아닐 경우: 타이머 만기 시마다 new_value->it_interval 값으로 타이머가 재로드된다. 
  • 0일 경우: 타이머는 it_value에 지정된 시점에 한번만 만기된다.

 

함수의 리턴값은 다음과 같다.

  • 0: 성공
  • -1: 실패(errno에 에러값이 설정된다)

 

에러 발생 시 설정되는 errno 값은 다음과 같다.

  • EFAULT: new_value, old_value 가 유효한 포인터가 아닐 경우
  • EINVAL: timerid가 유효하지 않을 경우, EINVAL new_vale.it_value가 음수일 경우, new_value.it_value.tv_nsec이 음수이거나 999,999,999 보다 클 경우

함수 사용의 예제는 다음과 같다.

int example(void)
{
  // timer_create() 함수로 timer 생성	

  struct itimerspec ts;
  ts.it_value.tv_sec = 1;  // 1초 후에 첫 만기된다.
  ts.it_value.tv_nsec = 0;
  ts.it_interval.tv_sec = 2; // 첫 만기 후 2초마다 만기된다.
  ts.it_interval.tv_nsec = 0;
  int ret = timer_settime(timer, 0, &ts, NULL);
  if (ret == -1) {
    printf("Fail to timer_settimer(): %m\n");
    return -1;
  }
  return 0;
}

 

댓글

Designed by JB FACTORY