본문 바로가기

개발/리눅스 프로그래밍

localtime() 사용 시 유의사항

시간관련 작업의 제일 기본 함수인 time()과 localtime() 함수를 사용하다가, 재미있는 사실을 알게 되었습니다.

#include <time.h>

struct tm *localtime(const time_t *timep);

함수 원형입니다.

 time_t 는 1970년 1월1일부터 지금까지 흐른 시간(초)을 나타내는 변수이고, 이 값을 사용해 날짜와 시간을 구하는 함수입니다.

struct tm이 날짜와 시간을 갖고 있는 구조체이고 이 구조체 포인터를 반환해줍니다.

 

이 때 중요한건, 함수 내부적으로 static struct tm 변수가 있고 이 변수의 포인터를 반환한다는 것입니다.

즉 함수를 실행할 때마다 같은 주소값을 받게 되는 것입니다.

#include <stdio.h>
#include <time.h>

int main(int args, char **argv) {
	time_t t;
    
    t = time(NULL);
    struct tm *ts1 = localtime( &t );
    sleep(30);
    
    t = time(NULL);
    struct tm *ts2 = localtime( &t );
    sleep(30);
    
    t = time(NULL);
    struct tm *ts3 = localtime( &t );
    sleep(30);
    
    printf("%d:%d:%d\n", ts1->tm_hour, ts1->tm_min, ts1->tm_sec);
    printf("%d:%d:%d\n", ts2->tm_hour, ts2->tm_min, ts2->tm_sec);
    printf("%d:%d:%d\n", ts3->tm_hour, ts3->tm_min, ts3->tm_sec);
    
	return 0;
}

이 코드를 3시30분0초에 실행한다면, 아래와 같은 결과가 나오게 됩니다.

3:31:00
3:31:00
3:31:00

 각기 다른 3개의 struct tm 포인터 변수이지만 세 변수는 모두 localtime함수 안의 static struct tm* 변수의 주소값을 갖게 되고, 함수를 호출할 때 마다 localtime 내부 변수에 값이 초기화되기 때문에 결국 3번째로 localtime을 실행할 때의 시간으로 모든 변수가 초기화되는 것입니다.

 

 localtime 말고도 이런 함수가 몇 있다고 들었는데 뭐가 있는지는 잘 모르겠네요...

 그냥 타임스탬프 찍는 용으로 쓸때는 상관없지만 시간을 기록해야 하는 경우엔 struct tm* 변수 그대로 저장하면 낭패를 볼 수 있으니 time_t로 변환( mktime() )하거나 memcpy로 값을 복사하는 방법을 추천드립니다.

'개발 > 리눅스 프로그래밍' 카테고리의 다른 글

CentOS7 NetworkManager 문제  (0) 2020.01.12
mariadb-connector 라이브러리 내부 버그  (0) 2020.01.07
좀비 프로세스 방지  (0) 2019.07.18
유닉스 파일 함수 정리  (0) 2019.07.18
유닉스 파일 시스템2  (0) 2019.07.17