Provided by: manpages-ja-dev_0.5.0.0.20210215+dfsg-1_all bug

名前

       clock_nanosleep - 指定したクロックでの高精度な実行停止 (sleep)

書式

       #include <time.h>

       int clock_nanosleep(clockid_t clock_id, int flags,
                           const struct timespec *request,
                           struct timespec *remain);

       -lrt とリンクする (バージョン 2.17 より前の glibc のみ)

   glibc 向けの機能検査マクロの要件 (feature_test_macros(7)  参照):

       clock_nanosleep():
           _XOPEN_SOURCE >= 600 || _POSIX_C_SOURCE >= 200112L

説明

       clock_nanosleep()   を使うと、 nanosleep(2) 同様、ナノ秒の精度で指定された期間だけ呼び出し
       たスレッドの実行を 停止することができる。 nanosleep(2)  と違うのは、呼び出し側が停止期間を
       どのクロックに対して計測するのかを選択  できる点と、停止期間を絶対値でも相対値でも指定でき
       る点である。

       このシステムコールに渡したり、このシステムコールが返したりする時間の値は timespec 構造体を
       使って指定される。この構造体の定義は以下の通りである。

           struct timespec {
               time_t tv_sec;        /* seconds */
               long   tv_nsec;       /* nanoseconds [0 .. 999999999] */
           };

       clock_id 引き数で、停止期間をどのクロックに対して計測するかを指定する。 この引き数には以下
       の値のいずれか一つを指定できる。

       CLOCK_REALTIME   システム全体で使われる実時間クロック。 このクロックは変更可能である。

       CLOCK_MONOTONIC  過去のある時点からの時間を計測する、単調増加のクロック。 起点となる時点は
                        システム起動後には変更されない。 このクロックは変更することができない。

       CLOCK_PROCESS_CPUTIME_ID
                        そのプロセスの全スレッドで消費される  CPU 時間を計測するプロセス単位の ク
                        ロック。このクロックは設定可能である。

       これらのクロックの詳細は  clock_getres(2)  を参照。   また、   clock_getcpuclockid(3)   と
       pthread_getcpuclockid(3) が返す CPU クロック ID は clock_id に渡すこともできる。

       flags が 0 の場合、 request に指定された値は clock_id で指定されたクロックの現在の値からの
       相対的な期間と解釈される。

       flagsTIMER_ABSTIME の場合、 request は指定されたクロックで計測される絶対時刻と解釈され
       る。 request が指定されたクロックの現在の値以下の場合、 clock_nanosleep() は、呼び出したス
       レッドの停止を行わず、すぐに返る。

       clock_nanosleep()  は、少なくとも request で指定された時間が経過するまで、呼び出したスレッ
       ドの実行を停止する。 シグナルハンドラーが呼び出されたり、そのプロセスを終了させるような シ
       グナルが配送されたりした場合にも、スレッドの実行停止は終了する。

       呼び出しがシグナルハンドラーによって割り込まれた場合、 clock_nanosleep()   はエラー  EINTR
       で失敗する。さらに、  remain  が NULL でなく、かつ flagsTIMER_ABSTIME でない場合には、
       remain に残りの停止時間が返される。 この値を使って  clock_nanosleep()   を再度呼び出すこと
       で、(相対的な期間の) 停止を完了することができる。

返り値

       要求された期間の停止に成功すると、 clock_nanosleep()  は 0 を返す。 シグナルハンドラーで割
       り込まれたり、エラーが発生したりした場合、  「エラー」の節のリストにある正のエラー番号のい
       ずれか一つを返す。

エラー

       EFAULT requestremain に無効なアドレスが指定された。

       EINTR  停止がシグナルハンドラーにより割り込まれた。

       EINVAL tv_nsec  フィールドの値が  0  から 999999999 の範囲でないか、 tv_sec の値が負であっ
              た。

       EINVAL clock_id が無効であった (CLOCK_THREAD_CPUTIME_IDclock_id  として有効な値ではな
              い)。

バージョン

       clock_nanosleep()   システムコールは Linux 2.6 で初めて登場した。 glibc ではバージョン 2.1
       以降でサポートされている。

準拠

       POSIX.1-2001.

注意

       request で指定された停止期間が、時間の計測に使用されるクロック (time(7)  参照)  の精度の倍
       数ちょうどでない場合、停止期間は一番近い次の倍数に  切り上げられる。さらに、停止が完了した
       後に、CPU が呼び出したスレッドを  もう一度実行できるようになるまでには、遅延が入る可能性が
       ある。

       絶対値指定のタイマーを使うのは、  nanosleep(2)  に書かれている類のタイマーのずれの問題を防
       止するのに役立つ (この種の問題は、シグナルに割り込まれた際に相対指定の停止を  繰り返し再開
       しようとするプログラムでは、かえって悪化する)。 これらの問題を回避して相対指定の停止を実行
       するには、 希望するクロックで clock_gettime(2)  を呼び出し、その返り値の時刻値に希望する期
       間を加算してから、 TIMER_ABSTIME フラグを指定して clock_nanosleep()  を呼び出す。

       sigaction(2)  で SA_RESTART フラグが指定されているかに関わらず、シグナルハンドラーにより割
       り込まれた後に clock_nanosleep() が再開されることは決してない。

       flagsTIMER_ABSTIME の場合、  remain  引き数は使用されず、不要である  (絶対値での停止で
       は、同じ request 引き数を使って再度呼び出すことができる)。

       POSIX.1 の規定では、 clock_nanosleep()  はシグナルの処理方法やシグナルマスクに影響を与えな
       い、とされている。

       POSIX.1 の規定では、 clock_settime(2)  で CLOCK_REALTIME  クロックの値を変更した後は、絶対
       値指定の  clock_nanosleep()  で停止しているスレッドを起動させる時刻の判定は、 新しいクロッ
       ク値を使って行われる、とされている。    新しいクロック値において停止期間の終了時刻が過去に
       なってしまった場合には、 clock_nanosleep()  はすぐに返ることになる。

       POSIX.1  の規定では、 clock_settime(2)  で CLOCK_REALTIME クロックの値を変更しても、相対値
       指定の clock_nanosleep()  で停止しているスレッドには影響を与えない、とされている。

関連項目

       clock_getres(2), nanosleep(2), restart_syscall(2), timer_create(2),  sleep(3),  usleep(3),
       time(7)

この文書について

       この  man ページは Linux man-pages プロジェクトのリリース 3.79 の一部 である。プロジェクト
       の説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。