Provided by: manpages-ja-dev_0.5.0.0.20221215+dfsg-1_all
名前
clock_getres, clock_gettime, clock_settime - クロックと時間の関数
書式
#include <time.h> int clock_getres(clockid_t clk_id, struct timespec *res); int clock_gettime(clockid_t clk_id, struct timespec *tp); int clock_settime(clockid_t clk_id, const struct timespec *tp); -lrt とリンクする (バージョン 2.17 より前の glibc のみ) glibc 向けの機能検査マクロの要件 (feature_test_macros(7) 参照): clock_getres(), clock_gettime(), clock_settime(): _POSIX_C_SOURCE >= 199309L
説明
関数 clock_getres() は 指定されたクロック clk_id の分解能 (精度) を探し出す。 res が NULL でない場合、その分解能を res で指される struct timespec に格納する。 クロックの分解能は実 装に依存し、 特定のプロセスによって設定することはできない。 clock_settime() の引き数 tp で指される時間の値が res の倍数でない場合、 res の倍数に切り詰められる。 関数 clock_gettime() と clock_settime() は、指定されたクロック clk_id の時間を取得または 設定する。 res と tp 引き数は timespec 構造体であり、 <time.h> で以下のように規定されている: struct timespec { time_t tv_sec; /* seconds */ long tv_nsec; /* nanoseconds */ }; clk_id 引き数は特定のクロックの識別子であり、そのクロックで動作する。 クロックはシステム全 体に適用することもでき、 その場合は全てのプロセスから見ることができる。 また 1 つのプロセ ス内でのみ時間を計測する場合は、 プロセス毎に適用することもできる。 全ての実装においてシステム全体のリアルタイムクロックがサポートされ、 CLOCK_REALTIME で識別 される。 時間は紀元 (the Epoch) からの秒とナノ秒で表される。 時間が変更された場合、相対的 な時間間隔のタイマーは影響を受けないが、 絶対的な時点のタイマーは影響を受ける。 さらにいくつかのクロックが実装されているかもしれない。 対応する時間の値を解釈する方法とタ イマーへの影響は、定められていない。 glibc と Linux カーネルの最新のバージョンでは、 以下のクロックがサポートされている。 CLOCK_REALTIME 実時間を計測するシステム全体で一意な時間。 このクロックを設定するには適切な特権が必 要である。 このクロックは、システム時間の不連続な変化 (例えば、システム管理者が シ ステム時間を手動で変更した場合など) や adjtime や NTP が行う 段階的な調整の影響を受 ける。 CLOCK_REALTIME_COARSE (Linux 2.6.32 以降; Linux 特有) 高速だが精度が低い CLOCK_REALTIME。速度が非常に必要で、かつ高精度のタイムスタンプが 不要な場合に使用するとよい。 CLOCK_MONOTONIC 設定することができないクロックで、ある開始時点からの単調増加の時間で 表現されるク ロック (開始時点がどの時点となるかは規定されていない)。 この時計は、システム時間の 不連続な変化 (例えば、システム管理者がシステ ム時間を手動で変更した場合など) の影響 を受けないが、 adjtime(3) や NTP が行う段階的な調整の影響を受ける。 CLOCK_MONOTONIC_COARSE (Linux 2.6.32 以降; Linux 特有) 高速だが精度が低い CLOCK_MONOTONIC。速度が非常に必要で、かつ高精度のタイムスタンプ が不要な場合に使用するとよい。 CLOCK_MONOTONIC_RAW (Linux 2.6.28 以降; Linux 特有) CLOCK_MONOTONIC と同様だが、NTP による調整や adjtime(3) が行う 段階的な調整の影響を 受けない、ハードウェアによる生の時刻へのアクセス ができる。 CLOCK_BOOTTIME (Linux 2.6.39 以降; Linux 固有) CLOCK_MONOTONIC と同じだが、システムがサスペンドされている時間も含まれる点が異な る。 これを使うと、アプリケーションはサスペンド状態も扱える "monotonic" なクロック を得ることができる。 しかも、 CLOCK_REALTIME における複雑な処理を行う必要もなくな る。 CLOCK_REALTIME では、 settimeofday(2) を使って時刻を変更した場合、時刻に不連続 な変化が発生するからだ。 CLOCK_PROCESS_CPUTIME_ID (Linux 2.6.12 以降) プロセス単位の CPU タイムクロック (そのプロセスの全スレッドで消費される CPU 時間を 計測する)。 CLOCK_THREAD_CPUTIME_ID (Linux 2.6.12 以降) スレッド固有の CPU タイムクロック。
返り値
clock_gettime(), clock_settime(), clock_getres() は成功した場合に 0 を返し、失敗した場合 に -1 を返す (失敗した場合、 errno が適切に設定される)。
エラー
EFAULT tp がアクセス可能なアドレス空間の外を指した。 EINVAL 指定された clk_id がこのシステムでサポートされていない。 EPERM 指示されたクロックを設定する権限が clock_settime() にない。
バージョン
これらのシステムコールは Linux 2.6 で初めて登場した。
準拠
SUSv2, POSIX.1-2001.
可用性
これらの関数が利用可能な POSIX システムでは、<unistd.h> においてシンボル _POSIX_TIMERS が 0 より大きい値に定義されている。 シンボル _POSIX_MONOTONIC_CLOCK, _POSIX_CPUTIME, _POSIX_THREAD_CPUTIME は CLOCK_MONOTONIC, CLOCK_PROCESS_CPUTIME_ID, CLOCK_THREAD_CPUTIME_ID が利用可能なことを示す。 (sysconf(3) も参照すること。)
注意
SMP システムに関する歴史的な注意事項 Linux が CLOCK_PROCESS_CPUTIME_ID と CLOCK_THREAD_CPUTIME_ID クロックのカーネルによるサ ポートを追加する前は、 glibc はこれらのクロックは多くのプラットフォームで CPU のタイマーレ ジスター (i386 上の TSC、Itanium 上の AR.ITC) を用いて実現されていた。 これらのレジスター は CPU 間で異なる可能性があり、 プロセスが他の CPU に移動させられた場合、 結果としてこれら のクロックが偽の結果 (bogus results) を返すかもしれない。 SMP システムの各 CPU が別々のクロック源を持つ場合、 タイマーレジスター間の相互関係を管理す る方法はない。 これは各 CPU が微妙に異なる周波数で動作するためである。 これが真実の場合 (訳註: 各 CPU が別々のクロック源を持つ場合)、 clock_getcpuclockid(0) は ENOENT を返し て、その状況を表す。 2 つのクロックは、プロセスが特定の CPU 上に留まっていることが 保証で きる場合にのみ有効である。 SMP システムの各プロセッサは全く同じ時刻に起動する訳ではないので、 各タイマーレジスターは 通常はあるオフセットで動作している。 オフセットをブート時に制限するコードが含まれるアーキ テクチャーもある。 しかし、このコードがオフセットを正確に調整することは保証できない。 glibc は (Linux カーネルとは異なり) オフセットを扱うためのコードを提供しない。 通常はこれ らのオフセットが小さいので、多くの場合でその影響は無視できる。 glibc 2.4 以降では、 このページで説明したシステムコールのラッパー関数は、 CLOCK_PROCESS_CPUTIME_ID と CLOCK_THREAD_CPUTIME_ID のカーネル実装が利用できるシステム (す なわち Linux 2.6.12 以降) ではカーネル実装を利用することで、 上述の問題を回避している。
バグ
POSIX.1-2001 では、 「適切な特権 (appropriate privileges)」を持ったプロセスは、 clock_settime() を使って、クロック CLOCK_PROCESS_CPUTIME_ID と CLOCK_THREAD_CPUTIME_ID を 設定することができるとされている。 Linux では、これらのクロックは設定可能ではない (すなわ ち、どのプロセスも「適切な特権」を持たない)。
関連項目
date(1), gettimeofday(2), settimeofday(2), time(2), adjtime(3), clock_getcpuclockid(3), ctime(3), ftime(3), pthread_getcpuclockid(3), sysconf(3), time(7)
この文書について
この man ページは Linux man-pages プロジェクトのリリース 3.79 の一部 である。プロジェクト の説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。 2013-12-28 CLOCK_GETRES(2)