名前


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);

説明


関数 clock_getres() は 指定されたクロック clk_id の分解能 (精度) を探し出す。 res が NULL でない場合、その分解能を res で指される struct timespec に格納する。 クロックの分解能は実装に依存し、 特定のプロセスによって設定することはできない。 clock_settime() の引き数 tp で指される時間の値が res の倍数でない場合、 res の倍数に切り詰められる。

関数 clock_gettime() と clock_settime() は、指定されたクロック clk_id の時間を取得または設定する。

restp 引き数は timespec 構造体であり、 <time.h> で以下のように指定されている:

struct timespec { time_t tv_sec; /* 秒 */ long tv_nsec; /* ナノ秒 */ };

clk_id 引き数は特定のクロックの識別子であり、そのクロックで動作する。 クロックはシステム全体に適用することもでき、 その場合は全てのプロセスから見ることができる。 また 1 つのプロセス内でのみ時間を計測する場合は、 プロセス毎に適用することもできる。

全ての実装においてシステム全体のリアルタイムクロックがサポートされ、 CLOCK_REALTIME で識別される。 時間は紀元 (the Epoch) からの秒とナノ秒で表される。 時間が変更された場合、相対的な時間間隔のタイマは影響を受けないが、 絶対的な時点のタイマは影響を受ける。

さらにいくつかのクロックが実装されているかもしれない。 対応する時間の値を解釈する方法とタイマへの影響は、定められていない。

GNU libc と Linux カーネルの最新のバージョンでは、 以下のような十分なクロックがサポートされている。
CLOCK_REALTIME
 システム全体のリアルタイムクロック。 このクロックを設定するには適切な特権が必要である。
CLOCK_MONOTONIC
 いくつかの開始点が指定されていないため、 クロックがモノトニックタイムを設定したり表現したりできない。
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_CPUTIMECLOCK_MONOTONIC, CLOCK_PROCESS_CPUTIME_ID, CLOCK_THREAD_CPUTIME_ID が利用可能なことを示す。 (sysconf(3) も参照すること。)

注意


多くのシステムでは、これらの関数を使うためにプログラムを librt ライブラリとリンクする必要がある。

SMP システムについての注意

CLOCK_PROCESS_CPUTIME_IDCLOCK_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 カーネルとは異なり) オフセットを扱うためのコードを提供しない。 通常はこれらのオフセットが小さいので、多くの場合でその影響は無視できる。

関連項目


date(1), adjtimex(2), gettimeofday(2), settimeofday(2), time(2), ctime(3), ftime(3), sysconf(3)

openSUSE Logo

コンテンツ