리눅스 시스템은 1970년 1월 1일 00:00:00 UTC (협정 세계시, Universal Time Coordinate)
로 정의된 기원(epoch)부터 경과된 절대 시간을 초로 표현한다.
리눅스에서 시간을 나타내는 자료구조
typedef long time_t;
에 정의되어 있다.
기원 시간 이후 경과한 초를 숫자로 표현한다.
마이크로 초
#include <sys/time.h>
struct timeval {
time_t tv_sec; /* 초 */
suseconds_t tv_usec; /* 마이크로 초 */
};
나노 초
#include <time.h>
struct timespec {
time_t tv_sec; /* 초 */
long tv_nsec; /* 나노 초 */
};
상세 시간 정보
#include <time.h>
struct tm {
int tm_sec; /* 초 */
int tm_min; /* 분 */
int tm_hour; /* 시 (0 ~ 23) */
int tm_mday; /* 월 경과일 */
int tm_mon; /* 월 (0~11) */
int tm_year; /* 년 (1900년 이후 경과 값) */
int tm_wday; /* 주 경과일 (0 ~ 6 일요일 이후 경과 값) */
int tm_yday; /* 연 경과일 */
int tm_isdst; /* 섬머타임 여부 */
#if def _BSD_SOURCE
long tm_gmtoff; /* GMT 시간대 오프셋 */
const char *tm_zone; /* 시간대 약어 */
#endif
};
현재 시간 획득
#include <time.h>
time_t time (time_t *t);
time() 함수를 이용하면 기원 시간(1970년 1월 1일 00:00:00) 이후 경과한 현재 시간을 초 단위로 표현하여 반환한다.
t가 NULL이 아니라면 현재 시간을 t 포인터에 기록한다.
에러 발생 시 -1 반환 후 errno 설정
EFAULT - 유효하지 않은 t 값
예시
#include <stdio.h>
#include <time.h>
int main() {
printf("time returned: %ld\n", (long)time(NULL));
return 0;
}
<br><br>
### 현재 시간 획득 (마이크로 초)
``` c
#include <sys/time.h>
int gettimeofday (struct timeval *tv, struct timezone *tz);
성공 시 tv가 가리키는 timeval 구조체에 기원 시간 이후 경과한 현재 시각을 기록하고 0 반환한다.
int main()
{
time_t t = time(NULL);
printf("time: %s", ctime(&t));
return 0;
}
<br><br>
- `_r 계열 함수`들의 의미는?
* 재진입 함수(Reentrancy)를 의미한다.
- 초기 POSIX.1에 기반한 C 함수들은 단일 스레드 프로세스 환경을 가정하고 만들어졌다.
- 멀티스레드 환경에서 재진입 가능한지 여부를 보장할 수 없다.
* 스레드 내에서 재진입이 불가능한 함수 호출 시 인자 데이터 내용을 변경한다든지 하여 결과값의 정합성을 보장하지 못하기 때문이다.
- 재진입 불가능한 함수
* 예: asctime(), gmtime(), ctime(), localtime() 등
- 이 문제를 해결하기 위해 _r이 붙은 별도의 함수 지정
* 예: asctime_r(), gmtime_r(), ctime_r(), localtime_r()
<br>
``` c
#include <time.h>
struct tm * gmtime (const time_t *timep);
struct tm * gmtime_r (const time_t *timep, struct tm *result);
struct tm * localtime (const time_t *timep);
strcut tm * localtime_r (const time_t *timep, struct tm *result);
14. 시간
시간 개요
리눅스 시스템의 기원 시간
리눅스에서 시간을 나타내는 자료구조
typedef long time_t;
현재 시간 획득
int main() { printf("time returned: %ld\n", (long)time(NULL)); return 0; }
int main() { struct timeval tv; int ret;
}
현재 시간 설정
시간 유틸리티
int main() { time_t t = time(NULL); printf("time: %s", ctime(&t)); return 0; }
잠들기