CLOCK_GETRES(2) | Linux Programmer's Manual | CLOCK_GETRES(2) |
名前
clock_getres, clock_gettime, clock_settime -クロックと時間の関数書式
#include <time.h>glibc 向けの機能検査マクロの要件 ( feature_test_macros(7) 参照):
説明
関数 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 固有)
- Identical to CLOCK_MONOTONIC, except it also includes any time that the system is suspended. This allows applications to get a suspend-aware monotonic clock without having to deal with the complications of CLOCK_REALTIME, which may have discontinuities if the time is changed using settimeofday(2).
- CLOCK_PROCESS_CPUTIME_ID
- CPU による高分解能のプロセス毎のタイマ。
- CLOCK_THREAD_CPUTIME_ID
- スレッド固有の CPU タイムクロック。
返り値
clock_gettime(), clock_settime(), clock_getres() は成功した場合に 0 を返し、失敗した場合に-1 を返す (失敗した場合、 errno が適切に設定される)。エラー
- EFAULT
- tp がアクセス可能なアドレス空間の外を指した。
- EINVAL
- 指定された clk_id がこのシステムでサポートされていない。
- EPERM
- 指示されたクロックを設定する権限が clock_settime() にない。
準拠
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 システムについての注意
CLOCK_PROCESS_CPUTIME_ID と CLOCK_THREAD_CPUTIME_ID クロックは、CPU からのタイマ (i386 上の TSC、Itanium 上の AR.ITC) を用いて実現されている。これらのレジスタは CPU 間で異なる可能性があり、プロセスが他の CPU に移動させられた場合、結果としてこれらのクロックが 偽の結果 (bogus results) を返すかもしれない。SMP システムの各 CPU が別々のクロック源を持つ場合、タイマレジスタ間の相互関係を管理する方法はない。これは各 CPU が微妙に異なる周波数で動作するためである。これが真実の場合 (訳註: 各 CPU が別々のクロック源を持つ場合)、 clock_getcpuclockid(0) は ENOENT を返して、その状況を表す。 2 つのクロックは、プロセスが特定の CPU 上に留まっていることが保証できる場合にのみ有効である。
SMP システムの各プロセッサは全く同じ時刻に起動する訳ではないので、各タイマレジスタは通常はあるオフセットで動作している。オフセットをブート時に制限するコードが含まれるアーキテクチャもある。しかし、このコードがオフセットを正確に調整することは保証できない。 glibc は (Linux カーネルとは異なり) オフセットを扱うためのコードを提供しない。通常はこれらのオフセットが小さいので、多くの場合でその影響は無視できる。
バグ
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.51 の一部である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。2013-02-25 |