- Tumbleweed 20260815-1.1
- Leap-16.0
- Leap-15.6
| gettimeofday(2) | System Calls Manual | gettimeofday(2) |
名前¶
gettimeofday, settimeofday - 時刻を取得/設定する
ライブラリ¶
標準 C ライブラリ (libc, -lc)
書式¶
#include <sys/time.h>
[[deprecated]]
int gettimeofday(struct timeval *restrict tv,
struct timezone *_Nullable restrict tz);
[[deprecated]]
int settimeofday(const struct timeval *tv,
const struct timezone *_Nullable tz);
settimeofday():
glibc 2.19 よりあと:
_DEFAULT_SOURCE
glibc 2.19 以前:
_BSD_SOURCE
説明¶
関数 gettimeofday() と settimeofday() は時刻とタイムゾーンを取得または設定します。
tv 引数は struct timeval(<sys/time.h>で定義)です:
struct timeval {
time_t tv_sec; /* 秒 */
suseconds_t tv_usec; /* マイクロ秒 */
};
これにより紀元 (the Epoch: time(2) を参照) からの秒とマイクロ秒が取得できます。
The tz 引数は struct timezone です:
struct timezone {
int tz_minuteswest; /* グリニッジ標準時との差 (西方に分単位) */
int tz_dsttime; /* 夏時間調整の型 */
};
tv や tz が NULL の場合、対応する構造体の設定/取得は行われません (ただし、tv が NULL の場合には、コンパイル時の警告が発生します)。
timezone 構造体の使用は廃止されました。tz 引数は通常 NULL と指定すべきです。「バージョン」も参照してください。
Linux では、 settimeofday() システムコールに関連して、独特の "クロックのズレ (warp clock)" が存在する場合があります。これは (ブート後の) 最初の呼び出しで tz 引数が NULL でなく、 tv 引数が NULL で tz_minuteswest フィールドが 0 でない場合に起こります (この場合 tz_dsttime フィールドは 0 にすべきです)。このような場合、 settimeofday() は CMOS クロックが地方時 (local time) であり、UTC システム時間を得るためには、tz_minuteswest の分だけ増加させなくてはならないとみなしてしまいます。 疑いもなく、この機構を使うことは良い考えではありません。
返り値¶
成功すると、 gettimeofday() と settimeofday() は 0 を返します。 エラーの場合、 -1 を返し、 errno にエラーを示す値を設定します。
エラー¶
- EFAULT
- tv か tz のどちらかがアクセス可能なアドレス空間外を指しています。
- EINVAL
- (settimeofday()): timezone が無効です。
- EINVAL
- (settimeofday()): tv.tv_sec が負または tv.tv_usec が [0, 999,999] の範囲外です。
- EINVAL (Linux 4.3 以降)
- (settimeofday()): 時間を CLOCK_MONOTONIC クロックの現在の値よりも小さい値に設定しようとしました (clock_gettime(2) を参照)。
- EPERM
- 呼び出し元プロセスに settimeofday() を呼び出すための十分な特権がありません。 Linux では CAP_SYS_TIME ケーパビリティ (capability) が必要です。
バージョン¶
C ライブラリ/kernel の違い¶
いくつかのアーキテクチャでは、gettimeofday() の実装は vdso(7) で提供されています。
カーネルは tv と tz の両方に対して NULL を受け付けます。timezone 引数は glibc と muslでは無視され、カーネルとの間で渡されません。Android の bionic は timezone 引数をカーネルとの間で渡しますが、Android は設定のデバイスタイムゾーンに基づいてカーネルタイムゾーンを更新しないので、カーネルのタイムゾーンは通常 UTC です。
標準¶
なし。
履歴¶
4.3 BSD,SVr4. SUSv1 と POSIX.1-2001 XSI は gettimeofday() を記述しましたが、settimeofday() は記述しませんでした。POSIX.1-2008 XSI は gettimeofday() を廃止としてマークし、代わりに clock_gettime(2) の使用を推奨しました。同様に、 settimeofday() の代わりに clock_settime(2) を使用すべきです。POSIX.1-2024 は gettimeofday() を削除しました。
昔は struct timeval のフィールドは long 型でした。
tz_dsttime フィールド¶
Linux 以外のカーネルで、glibc では struct timezone の tz_dsttime フィールドは、現在のタイムゾーンに夏時間規則が適用されたことがあるか、適用される予定であれば、gettimeofday() によってゼロ以外の値に設定されます。この意味では、現在のタイムゾーンに対するdaylight(3) の意味を正確に反映しています。Linuxでは、glibc では struct timezone の tz_dsttime フィールド""の設定は、settimeofday() または gettimeofday() によって使用されたことはありません。これは libc や glibc ではサポートされておらず、今後もサポートされません。カーネルソースでこのフィールドが(宣言を除いて)発生するのはすべてバグです。したがって、以下は純粋に歴史的な関心事です。
tz_dsttime フィールドには (下記に示す) シンボル定数が格納されます。これは一年のうちでいつ夏時間 (Daylight Savings Time) を実施するかを示しています(注意: その値は年間を通した定数です: 夏時間が実施中であることを示すわけではなく、アルゴリズムを選択しているだけです)。夏時間は以下のように定義されます:
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 /* Romania */ DST_TUR /* Turkey */ DST_AUSTALT /* Australian style with shift in 1986 */
もちろん、夏時間が適用される期間は、国ごとに 1つの単純なアルゴリズムでは与えられないことがわかりました。実際、この期間は予測不可能な政治的決定によって決定されます。そのため、このタイムゾーンの表現方法は放棄されました。
注意¶
gettimeofday() が返す時刻は、システム時間の不連続な変化(たとえば、システム管理者がシステム時間を手動で変更した場合など)の影響を受けます。単調増加するクロックが必要な場合は、clock_gettime(2) を参照してください。
timeval 構造体を操作するためのマクロの説明は timeradd(3) にあります。
関連項目¶
date(1), adjtimex(2), clock_gettime(2), time(2), ctime(3), ftime(3), timeradd(3), capabilities(7), time(7), vdso(7), hwclock(8)
| 2026-02-08 | Linux man-pages (未リリース) |