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;		/* seconds */
long	tv_usec;	/* microseconds */
};

そして tz は timezone 構造体である:

struct timezone {
int    tz_minuteswest; /* minutes W of Greenwich */
int    tz_dsttime;     /* type of dst correction */
};

timezone 構造体の使用は廃止(obsolete)された。 tz_dsttime フィールドは Linux では使用されない。libc や glibc によって サポートされることはない。カーネルのソース中にこのフィールド が存在するのは全てバグである。それらは純粋に歴史的なものである。 tz_dsttime フィールドは(以下で与えられるような)シンボル定数を格納している。 これは一年のうちでいつ夏時間(Daylight Savings Time)を実施するかを 示している。(注意: その値は年間の定数で DST を実施することを指示し ているわではなく、アルゴリズムを選択している。) 夏時間(daylight savings times)は以下のように定義される:

DST_NONE /* not on dst */
DST_USA /* USA style dst */
DST_AUST /* Australian style dst */
DST_WET /* Western European dst */
DST_MET /* Middle European dst */
DST_EET /* Eastern European dst */
DST_CAN /* Canada */
DST_GB /* Great Britain and Eire */
DST_RUM /* Rumania */
DST_TUR /* Turkey */
DST_AUSTALT /* Australian style with shift in 1986 */

もちろん、どの期間に夏時間を実施するかに単純なアルゴリズムは 存在せず国ごろに異っている。実際にこの期間は予知できない政治的な 決定である。それでこのタイム・ゾーンの表現方法は放棄された。 Linux において、 settimeofday コールは tz_dsttime フィールドにはゼロにする必要がある。

Linux において独特の「クロックのズレ(warp clock)」が settimeofday システム・コールに関連して存在する。これは(ブート後の)最初のコールで tz 引き数が NULL でなく、 tv 引き数が NULL で tz_minuteswest フィールドがゼロでない場合におこる。このような場合、 CMOS クロックは地方時(local time)であるとみなし、UTC システム時間を 得るために、この時間を増加させる。 この仕様を使うことはおそらく良い考えではないだろう。

timeval 構造体を操作するために以下のマクロ(macro)が定義されている :
#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 は成功するとゼロを返し、失敗した場合は -1 を返す(この場合は errno が適切に設定される)。

エラー

EPERM
    settimeofday がスーパー・ユーザー以外から呼び出された。

EINVAL
    タイムゾーン(または他の何か)が不正である。

EFAULT
    tv か tz のどちらかがアクセス可能なアドレス空間の外部を指している。

準拠
SVr4, BSD 4.3

関連項目
date(1), adjtimex(2), time(2), ctime(3), ftime(3)