시간과 날짜에 대한 시스템콜들을 알아보겠다. time() 부터 보겠음
time 함수는 현재 시간값을 반환하는 함수이다. 근데 시간 계산이 좀 특이함. 리눅스의 기원? 시간이 1970년 1월 1일 00시 00분 00초 부터 시작해 저 시간 부터 초 단위로 계산하여 현재 시간을 구한다.
아 그럼 gettimeofday 함수는 뭐지? 좀더 상세하게 ms(밀리 세컨드) 단위로 계산하는 것이다.
tp라는 timeval 구조체를 가르키는 포인터에 현재 시간을 저장한다.
tzp는 NULL을 무조건 넣어야 한다는데.. 유닉스 규격에 그렇게 되어있단다.
gettimeofday 함수같이 밀리 세컨 까지 표기하는 것은 몇몇 시스템에서 굉장히 효과적일 수 있다.
시간이 정말 중요한 그런 부분..
timeval 구조체는 아래와 같이 생겼다.
struct timeval {
time_t tv_sec; /* seconds */
long tv_usec; /* microseconds */
};
이렇게 time으로 time_t 정수값을 얻었다면, 다양한 시간함수들을 이용하여
같은 내용을 다른 형태로 표기할 수 있다.
다양한 시간함수들이 후에 공부할 함수들이다.
화살표에 붙어있는 글자들이 사용되는 시간 함수들이다.
time 함수를 이용하여 time_t를 커널로 부터 받아온 상태가 방금 배운 것이다.
gmtime, localtime, mktime 시간함수들에 대해 알아보자.
time 함수로 인해 반환되는 time_t 값이 위 3가지 함수로 인해 다른 형태로 변환되는 모습이다.
음?? tm 이라는 구조체가 또 보인다. 구조를 보니 tm 구조체가 변환의 핵이되는 녀석인것 같다.
struct tm { /* a broken-down time */
int tm_sec; /* seconds after the minute: [0 - 60] */
int tm_min; /* minutes after the hour: [0 - 59] */
int tm_hour; /* hours after midnight: [0 - 23] */
int tm_mday; /* day of the month: [1 - 31] */
int tm_mon; /* months since January: [0 - 11] */
int tm_year; /* years since 1900 */
int tm_wday; /* days since Sunday: [0 - 6] */
int tm_yday; /* days since January 1: [0 - 365] */
int tm_isdst; /* daylight saving time flag: <0, 0, >0 */
};
그림을 잘 보면, gmtime 과 localtime은 time_t 값에서 tm 구조체로 변환되는 과정이고,
mktime은 반대 과정, tm 구조체에서 time_t 로 바뀌는 것이다. 하나씩 보자.
두가지는 똑같이 생겼다. time을 받아와서 tm 구조체에 값을 할당해주는 함수들이다. 차이가 있다면,
gmtime() 함수는 UTC를 기준으로 시간을 할당하고
localtime() 함수는 시스템 로컬 시간을 기준으로 시간을 할당한다. (e.g. GMT+09:00 in seoul)
그럼 반대로 변환되는 mktime은 어떻게 생겼을까
보시다 시피, tm 구조체에 의해 분할된 시간을 time_t 값으로 돌려준다.
다음으로,, 시간 값들을 문자열로 변환해주는 asctime()과 ctime() 두 함수에 대해 알아본다.
얘네 둘다 시간값을 사람이 보기 쉽게 26바이트 짜리 문자열로 변환시켜 준다.
다만, 어떤 값을 가지고 문자열로 변환하는지에 차이가 있다.
그림을 보면 ctilme은 time_t 값을 참조하고, asctime은 tm 구조체를 참조하고 있다.
함수의 형태를 보겠음.
다음은.. 상대적으로 좀 복잡한? 함수이다. strftime(), 시간을 여러가지 형태로 반환하는 함수이다.
tm구조체에서 분할된 문자를 가지고와서 원하는 형태로 바꾸어 보여주는 것.
인자가 4개나 된다.
3번째 인자가 시간값의 포맷을 결정하는 것인데,
아래 표 대로 나온다.
솔직히 시간을 이렇게 자세하게 표현할 필요가 있나..싶다. 내생각
ctime, asctime 으로도 충분한거 같음..
'IT 그리고 정보보안 > Knowledge base' 카테고리의 다른 글
리눅스 프로세스 상호 관계 (0) | 2021.04.14 |
---|---|
리눅스 프로세스 생성, 실행 그리고 제어 (0) | 2021.04.14 |
리눅스 디렉토리 관리 (0) | 2021.04.14 |
리눅스 환경의 파일 관리 (0) | 2021.04.14 |
리눅스 파일 권한 (0) | 2021.04.14 |