시간관련 작업의 제일 기본 함수인 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 |