Provided by: manpages-ja-dev_0.5.0.0.20221215+dfsg-1_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.79 の一部  である。プロジェクト
       の説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。

                                            2013-12-28                            CLOCK_GETRES(2)