사용 헤더
사용 구조체
struct timeval {
time_t tv_sec;
suseconds_t tv_usec;
};
struct timezone {
int tz_minuteswest;
int tz_dsttime;
};
struct tm {
int tm_sec;
int tm_min;
int tm_hour;
int tm_mday;
int tm_mon;
int tm_year;
int tm_wday;
int tm_yday;
int tm_isdst;
};
struct itimerval {
struct timeval it_interval;
struct timeval it_value;
};
사용 함수
- time(): 1970년 1월 1일 0시 0분 0초 부터 현재 시각까지 지난 초를 계산하는 함수
time_t time(time_t *tloc);
파라미터
- tloc: 현재 시간값을 저장할 버퍼(NULL 입력 가능)
반환값
- 1970년 1월 1일 0시 0분 0초(UTC)로부터 현재 시각까지 지난 초
- 실패: -1
- gettimeofday(): 현재 시간값을 더 구체적으로 계산해서 timaval 구조체 에 저장함.
int gettimeofday(struct timeval *tv, struct timezone *tz);
파라미터
- tv: 현재 시간값을 저장할 버퍼
- 1970년 1월 1일 0시 0분 0초(UTC)로부터 현재 시각까지 지난 시간 - tz: 사용되지 않음
반환값
- 성공: 0
- 실패: -1
- localtime(): timezone 기반 시간 정보를 가져오는 함수
struct tm *localtime(const time_t *timep);
struct tm *localtime_r(const time_t *timep, struct tm *result); --> thread safe 함수
파라미터
- timep: 변환할 시간 정보
- result: thread-safe 지원을 위한 버퍼
반환값
- 성공시세분화된시간정보
- 실패시 NULL
- gmtime(): UTC 기반 시간 정보를 가져오는 함수
struct tm *gmtime(const time_t *timep);
struct tm *gmtime_r(const time_t *timep, struct tm *result); -> thread safe 함수
파라미터
- timep: 변환할 시간 정보
- result: thread-safe 지원을 위한 버퍼
반환값
- 성공: 세분화된 시간 정보
- 실패: NULL
- mktime(): localtime 기준으로 세분화된 시간 정보를 초단위 시간 정보로 변경하는 함수
time_t mktime(struct tm *tm);
파라미터
- tm:세분화된 시간 정보
반환값
- 성공: 초 단위 현재 시각 정보
- 실패: -1
- alarm(): 일정 시간 후 SIGALARM 을 보내는 함수
unsigned int alarm(unsigned int seconds);
파라미터
- seconds: 타임아웃 값(초단위)
- 단, 0인 경우 이전 타이머를 해제
반환값
- 성공: 이전 타이머 설정이 만료까지 남은시간
- 이전 타이머가 없는 경우: 0
- 해당 함수는 단 한번만 알람을 맞춰주는 함수임.
- getitimer, setitimer: 타이머를 설정한 인터벌마다 실핼하도록 만드는 함수
int getitimer(int which, struct itimerval *curr_value);
int setitimer(int which, const struct itimerval *new_value,
struct itimerval *old_value);
파라미터
- which: 타이머의 종류
- ITIMER_REAL: 실제 시간(SIGALARM 전송)
- ITIMER_VIRTUAL: 사용자 영역 코드가 수행되는 동안에만 타이머가 흐름(SIGVTALRM 전송)
- ITIMER_PROF
- ITIMER_REAL
- new_value: 설정할 타임아웃 정보
- old_value: 기존 타임아웃 정보
반환값
- 성공: 0
- 실패: -1
예제 코드
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>
#include<errno.h>
#include<time.h>
#include<sys/time.h>
#include<signal.h>
static void print_time(void)
{
time_t now;
struct tm now_tm;
if(time(&now) == -1){
printf("time() fail: %s\n", strerror(errno));
return ;
}
if(localtime_r((const time_t *)&now, &now_tm) == NULL){
printf("localtime_r() fail: %s\n", strerror(errno));
return ;
}
printf("[TIME] %d-%d-%d %d:%d:%d\n", 1900+now_tm.tm_year, 1+now_tm.tm_mon, now_tm.tm_mday, now_tm.tm_hour, now_tm.tm_min, now_tm.tm_sec);
}
static void sigalarm_handler(int signum)
{
printf("got SIGALRM(%d)\n", signum);
print_time();
}
static void setting_itimerval(struct itimerval *val)
{
val->it_interval.tv_sec = 1;
val->it_interval.tv_usec = 0;
val->it_value.tv_sec = 1;
val->it_value.tv_usec = 0;
}
int main(int argc, char **argv)
{
int ret = 0;
struct itimerval val;
signal(SIGALRM, (sig_t)sigalarm_handler);
setting_itimerval(&val);
ret = setitimer(ITIMER_REAL, (const struct itimerval *)&val, NULL);
if(ret){
printf("setitimer() fail: %s\n", strerror(errno));
return -1;
}
printf("= Start infinite loop while(1)\n");
while(1){
sleep(1);
}
return 0;
}