Provided by: manpages-ja-dev_0.5.0.0.20140515+dfsg-2_all bug

名前

       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 の時間を取得または設定する。

       restp 引き数は 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_CPUTIMECLOCK_MONOTONIC,  CLOCK_PROCESS_CPUTIME_ID,  CLOCK_THREAD_CPUTIME_ID が利用可能なことを示す。 (sysconf(3)
       も参照すること。)

注意

   SMP システムに関する歴史的な注意事項
       Linux が CLOCK_PROCESS_CPUTIME_IDCLOCK_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_IDCLOCK_THREAD_CPUTIME_ID のカーネル実装が利用できるシステム (すなわち Linux 2.6.12 以降)  ではカーネル実装
       を利用することで、 上述の問題を回避している。

バグ

       POSIX.1-2001  では、  「適切な特権 (appropriate privileges)」を持ったプロセスは、 clock_settime()  を使っ
       て、クロック  CLOCK_PROCESS_CPUTIME_IDCLOCK_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.65 の一部 である。プロジェクトの説明とバグ報告
       に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。

                                                   2013-12-28                                    CLOCK_GETRES(2)