Scroll to navigation

CLOCK_NANOSLEEP(2) Linux Programmer's Manual CLOCK_NANOSLEEP(2)

名前

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

書式

#include <time.h>

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

-lrt でリンクする。


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

clock_nanosleep(): _XOPEN_SOURCE >= 600

説明

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

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


struct timespec {

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

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

システム全体で使われる実時間クロック。 このクロックは変更可能である。
過去のある時点からの時間を計測する、単調増加のクロック。 起点となる時点はシステム起動後には変更されない。 このクロックは変更することができない。
そのプロセスの全スレッドで消費される CPU 時間を計測するプロセス単位の クロック。このクロックは設定可能である。

これらのクロックの詳細については clock_getres(2) を参照。

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

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

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

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

返り値

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

エラー

requestremain に無効なアドレスが指定された。
停止がシグナルハンドラにより割り込まれた。
tv_nsec フィールドの値が 0 から 999999999 の範囲でないか、 tv_sec の値が負であった。
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), timer_create(2), sleep(3), usleep(3), time(7)

2008-07-09 Linux