localtime 함수 사용 시 오류에 관하여 질문 드립니다.
안녕하세요
localtime 과 관련하여 문제가 생겨서 질문을 드리게 되었습니다.
어플리케이션이 구동하면서 Log를 출력 및 저장하게끔 되어있는데요.
로그 저장은 큐에 쌓인 로그를 스케줄링하며 한 포인트에서만 저장하고 있고, localtime으로 얻은 시간으로 년월일.log( ex) 20180509.log) 와 같은 형태로 저장하고 있습니다.
그런데 간헐적으로 파일 이름이 19700101.log 로 저장되는 경우가 생기고 있습니다.
저 19700101이란 부분을 구글에서 찾아보니 time 함수로 현재 카운트 시간(UTC 1970년 1월 1일 00:00:00로부터 흘러간 초) 이라고 하는 것은 알게 되었습니다.
그래서 저는 localtime으로 얻는 시간이 가끔 잘못되는 것인가 라고 추측만 하고 있습니다.
사실 어플리케이션에서 localtime과 gmtime 등을 여기저기서 많이 쓰고 있습니다.
혹시 이와 같은 경험을 해보신분 있으면 답변 부탁드립니다...
아래는 로그 파일 저장시에 사용되는 코드 입니다
time_t nowT;
struct tm *tmptr;
(void)time(&nowT);
tmptr = localtime(&nowT);
while (!m_Queue.empty())
{
memset(filename,0,sizeof(filename));
memset(foldername,0,sizeof(foldername));
sprintf(filename, "%04d%02d%02d.log",tmptr->tm_year+1900,tmptr->tm_mon+1,tmptr->tm_mday);
sprintf( rootname, "%s", getenv( _UNI_LOG_DIR ) );
sprintf( foldername, "%s/%s", getenv( _UNI_HOME_DIR ), filename );
fp = fopen(foldername,"a+t");
if(fp==NULL)
{
return;
}
fprintf(fp, (char*)(m_Queuedata.front()).c_str());
m_Queue.pop();
m_Queuedata.pop();
fclose(fp);
}
localtime 대신에 localtime_r을
localtime 대신에 localtime_r을 사용해보세요.
localtime에서 반환된 값은 다른 localtime, gmtime 등의 함수호출때 덮어쓰여질수 있습니다.
여기저기서 많이 쓰고 있다니 혹시 이게 문제가 아닌가 생각되네요.
조언 감사드립니다~!
조언 감사드립니다~!
저는 localtime으로 문제 사항을 재현해볼 목적으로 다중 스레드(스레드 10개 정도, Mutex 처리 안하고)에서 localtime을 계속 호출하며 프린트해본 결과 문제가 재현되진 않았습니다.
하지만 오랜 시간 돌리지 않았고, 기존 어플리케이션도 정말 간헐적으로 그런 거니 다시한번 오랜시간 돌려서 재현해볼 필요가 있을 것같습니다.
일단 최종으로는 localtime_r 로 변경하는 것으로 목적을 두어야겠네요~! ^^
답변 감사드립니다~!
내용과는 상관없이.fprintf(fp, (char*)
내용과는 상관없이.
fprintf(fp, (char*)(m_Queuedata.front()).c_str());
이 부분은
fprintf(fp, "%s", (char*)(m_Queuedata.front()).c_str());
로 하는게 좋습니다. 만약 data 중에 % 관련된 문자열이 있으면 fprintf는 이상한 메모리에 접근을 할 수 있습니다.
혹시나 time 값이 다른 것에 의해 overflow되어 초기화 된 것이 아닌지 의심도 해봐야합니다.
---
http://coolengineer.com
조언 감사드립니다~!
조언 감사드립니다~!
fprintf 사용 시 저의 글과 사용할 경우 메모리 문제가 발생할 수 있단걸 몰랐네요 ㅠ
조언해주신 대로 수정해놔야겠네요~!
감사합니다~!
댓글 달기