GETTIMEOFDAY(2)

이름
gettimeofday, settimeofday - 시간을 알아내거나 설정한다.

사용법
#include <sys/time.h>
#include <unistd.h>

int gettimeofday(struct timeval *tv, struct timezone *tz);
int settimeofday(const struct timeval *tv , const struct timezone *tz);

설명
gettimeofday와 settimeofday는 시간대(timezone)과 시간을 설정할 수 있다. tv는 /usr/include/sys/time.h에 정의되어 있는 timeval 구조체이다:

struct timeval {
long	tv_sec;     /* 초 */
long	tv_usec;    /* 마이크로초 */
};

tz는 timezone이다 :

struct timezone {
int	tz_minuteswest; /* 그리니치 서측 분차(minutes) */
int	tz_dsttime;     /* DST 보정 타입 */
};

timezone struct 는 사용하지 않는다; 리눅스에서 tz_dsttime 필드가 사용되지 않는다. - 지금까지 그렇고 앞으로도 libc나 glibc에서 지원되지 않을 것이다. 커널 소스에서(선언 이외에) 이 필드가 나오는 모든 경우는 버그이다. 그래서 다음 내용은 순수히 역사적인 흥미거리다. tz_dsttime 필드는 Daylight Saving Time(일광 절약 시간) 년도에 강제로 지정되는 상징적인 상수값(아래에 있는 값들)을 갖는다. (주의: 이 값은 그 해동안 일정하다. - DST 값은 강제로 지정되지 않으며, 알고리즘에서 선택된다.) Daylight Saving Time 알고리즘은 아래처럼 정의된다:

 DST_NONE    /* dst 사용하지 않음 */
 DST_USA    /* USA 스타일 dst */
 DST_AUST    /* 오스트레일리아 스타일 dst */
 DST_WET    /* 서부 유럽 dst */
 DST_MET    /* 중부 유럽 dst */
 DST_EET    /* 동부 유럽 dst */
 DST_CAN    /* 캐나다 */
 DST_GB    /* 영국와 아일랜드 */
 DST_RUM    /* 루마니아 */
 DST_TUR    /* 터키 */
 DST_AUSTALT    /* 1986의 오스트레일리아 스타일 */

물론, 이것은 Daylight Saving Time 기간이 나라마다 단순한 알고리즘으로 강제로 주어질 수 없음을 말한다: 실제로, 이 기간은 정치적 이유로 결정된다. 그래서 시간대을 표현하는 이 방법은 버려졌다. 리눅스에서, settimeofday 시스템 콜의 tz_dsttime 필드는 0이어야 한다.

리눅스에서는, tz 인자가 NULL이 아닌 경우나, tv 인자가 NULL이고 tz_minuteswest 필드가 0이 아닌 인자로 settimeofday가 (부팅후) 처음 호출된다면 특별한 `wrap clock` 의미가 있다. 그런 경우는 CMOS 시계는 로컬 시간이며, UTC 시스템 시간을 얻기 위한 시간만큼 증가했음을 말한다. 의심할 여지없이 이러한 특징을 사용하는 것은 좋지 않다.

다음 매크로는 timeval 구조체 연산을 위해 정의된다:
#define	timerisset(tvp)\
((tvp)->tv_sec || (tvp)->tv_usec)
#define	timercmp(tvp, uvp, cmp)\
((tvp)->tv_sec cmp (uvp)->tv_sec ||\
(tvp)->tv_sec == (uvp)->tv_sec &&\
(tvp)->tv_usec cmp (uvp)->tv_usec)
#define	timerclear(tvp)\
((tvp)->tv_sec = (tvp)->tv_usec = 0)

만일, tv나 tz가 null이라면, 관련 구조체는 설정되지 않거나 반환되지 않는다.

슈퍼유저만이 settimeofday를 사용할 수 있다.

반환값
gettimeofday와 settimeofday 모두 성공하면 0을 리턴하며, 실패시에는 -1을 리턴한다. (errno는 적당한 값으로 설정된다.)

에러

EPERM
    settimeofday가 슈퍼유저이외의 다른 사용자에 의해 호출되었다.

EINVAL
    시간대(또는 그외의 어떤 것)가 유효하지 않다.

EFAULT
    tv나 tz 중 하나가 접근할 수 없는 영역을 가리키고 있다.

호환
SVr4, BSD 4.3

관련 항목
date(1), adjtimex(2), time(2), ctime(3), ftime(3)

역자
정강훈 <skyeyes@soback.kornet.net>, 2000년 5월 1일