[리눅스 프로그래밍] 시간 다루기

Yoon Yeoung-jin·2022년 6월 26일
0

Linux

목록 보기
5/13

사용 헤더

  • #include<time.h>

사용 구조체

struct timeval {
			time_t      tv_sec;     /* seconds */
			suseconds_t tv_usec;    /* microseconds */
};

struct timezone {
		int tz_minuteswest;     /* minutes west of Greenwich */
    int tz_dsttime;         /* type of DST correction */
};

struct tm {
		int tm_sec;    /* Seconds (0-60) */
		int tm_min;    /* Minutes (0-59) */
		int tm_hour;   /* Hours (0-23) */
		int tm_mday;   /* Day of the month (1-31) */
		int tm_mon;    /* Month (0-11) */
		int tm_year;   /* Year - 1900 */
		int tm_wday;   /* Day of the week (0-6, Sunday = 0) */
		int tm_yday;   /* Day in the year (0-365, 1 Jan = 0) */
		int tm_isdst;  /* Daylight saving time */
};

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 입력 가능)
    반환값
    - 197011000(UTC)로부터 현재 시각까지 지난 초 
    - 실패: -1
  • gettimeofday(): 현재 시간값을 더 구체적으로 계산해서 timaval 구조체 에 저장함.
    int gettimeofday(struct timeval *tv, struct timezone *tz);
    파라미터
    - tv: 현재 시간값을 저장할 버퍼
    - 197011000(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;
    
}
profile
신기한건 다 해보는 사람

0개의 댓글