int clock_nanosleep(clockid_t clockid, int flags, const struct timespec *request, struct timespec *remain);
-lrt とリンクする (バージョン 2.17 より前の glibc のみ)
glibc 向けの機能検査マクロの要件 (feature_test_macros(7) 参照):
clock_nanosleep():
このシステムコールに渡したり、このシステムコールが返したりする時間の値は timespec 構造体を使って指定される。この構造体の定義は以下の通りである。
struct timespec {
time_t tv_sec; /* seconds */
long tv_nsec; /* nanoseconds [0 .. 999999999] */
};
clockid 引き数で、停止期間をどのクロックに対して計測するかを指定する。 この引き数には以下の値のいずれか一つを指定できる。
これらのクロックの詳細は clock_getres(2) を参照。 また、 clock_getcpuclockid(3) と pthread_getcpuclockid(3) が返す CPU クロック ID は clockid に渡すこともできる。
flags が 0 の場合、 request に指定された値は clockid で指定されたクロックの現在の値からの相対的な期間と解釈される。
flags が TIMER_ABSTIME の場合、 request は指定されたクロックで計測される絶対時刻と解釈される。 request が指定されたクロックの現在の値以下の場合、 clock_nanosleep() は、呼び出したスレッドの停止を行わず、すぐに返る。
clock_nanosleep() は、少なくとも request で指定された時間が経過するまで、呼び出したスレッドの実行を停止する。 シグナルハンドラーが呼び出されたり、そのプロセスを終了させるような シグナルが配送されたりした場合にも、スレッドの実行停止は終了する。
呼び出しがシグナルハンドラーによって割り込まれた場合、 clock_nanosleep() はエラー EINTR で失敗する。さらに、 remain が NULL でなく、かつ flags が TIMER_ABSTIME でない場合には、 remain に残りの停止時間が返される。 この値を使って clock_nanosleep() を再度呼び出すことで、(相対的な期間の) 停止を完了することができる。
絶対値指定のタイマーを使うのは、 nanosleep(2) に書かれている類のタイマーのずれの問題を防止するのに役立つ (この種の問題は、シグナルに割り込まれた際に相対指定の停止を 繰り返し再開しようとするプログラムでは、かえって悪化する)。 これらの問題を回避して相対指定の停止を実行するには、 希望するクロックで clock_gettime(2) を呼び出し、その返り値の時刻値に希望する期間を加算してから、 TIMER_ABSTIME フラグを指定して clock_nanosleep() を呼び出す。
sigaction(2) で SA_RESTART フラグが指定されているかに関わらず、シグナルハンドラーにより割り込まれた後に clock_nanosleep() が再開されることは決してない。
flags が TIMER_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() で停止しているスレッドには影響を与えない、とされている。