- Tumbleweed 20260815-1.1
- Leap-16.0
- Leap-15.6
| clock_nanosleep(2) | System Calls Manual | clock_nanosleep(2) |
名前¶
clock_nanosleep - 指定したクロックでの高精度な実行停止 (sleep)
ライブラリ¶
glibc 2.17 から標準 C ライブラリ (libc,\ -lc)
glibc 2.17 より前は、Real-time library (librt,\ -lrt)
書式¶
#include <time.h>
int clock_nanosleep(clockid_t clockid, int flags,
const struct timespec *t,
struct timespec *_Nullable remain);
clock_nanosleep():
_POSIX_C_SOURCE >= 200112L
説明¶
clock_nanosleep() を使うと、 nanosleep(2) 同様、ナノ秒の精度で指定された期間だけ呼び出したスレッドの実行を停止することができます。nanosleep(2) と違うのは、呼び出し側が停止期間をどのクロックに対して計測するのかを選択できる点と、停止期間を絶対値でも相対値でも指定できる点です。
この呼び出しに渡される時刻値と、この呼び出しから返される時刻値は、timespec(3) 構造体を使用して指定されます。
clockid 引数で、停止期間をどのクロックに対して計測するかを指定します。この引数には以下の値のいずれか一つを指定できます。
- CLOCK_REALTIME
- システム全体で使われる実時間クロック。 このクロックは変更可能です。
- CLOCK_TAI (Linux 3.10 以降)
- システム全体の時計は、壁時計の時間から派生しますが、閏秒をカウントします。
- CLOCK_MONOTONIC
- 過去のある時点からの時間を計測する、単調増加のクロック。 起点となる時点はシステム起動後には変更されません。このクロックは変更することができません。
- CLOCK_BOOTTIME (Linux 2.6.39 以降)
- CLOCK_MONOTONIC と同じですが、システムがサスペンドされている時間も含まれる点が異なります。
- CLOCK_PROCESS_CPUTIME_ID
- そのプロセスの全スレッドで消費される CPU 時間を計測するプロセス単位のクロック。このクロックは設定可能です。
これらのクロックの詳細は clock_getres(2) を参照。 また、 clock_getcpuclockid(3) と pthread_getcpuclockid(3) が返す CPU クロック ID は clockid に渡すこともできます。
flags が 0 の場合、 t で指定された値は clockid で指定されたクロックの現在の値からの相対的な時間間隔と解釈されます。
flags が TIMER_ABSTIME の場合、 t は指定されたクロック clockid で計測される絶対時刻と解釈されます。 t が指定されたクロックの現在の値以下の場合、 clock_nanosleep() は、呼び出したスレッドの停止を行わず、すぐに戻ります。
clock_nanosleep() は、少なくとも t で指定された時間が経過するまで、呼び出したスレッドの実行を停止します。 シグナルハンドラが呼び出されたり、そのプロセスを終了させるような シグナルが配送されたりした場合にも、スレッドの実行停止は終了します。
呼び出しがシグナルハンドラによって割り込まれた場合、 clock_nanosleep() はエラー EINTR で失敗する。さらに、 remain が NULL でなく、かつ flags が TIMER_ABSTIME でない場合には、 remain に残りの停止時間が返されます。 この値を使って clock_nanosleep() を再度呼び出すことで、(相対的な期間の) 停止を完了することができます。
返り値¶
要求された期間の停止に成功すると、 clock_nanosleep() は 0 を返します。 シグナルハンドラで割り込まれたり、エラーが発生したりした場合、 「エラー」の節のリストにある正のエラー番号のいずれか一つを返します。
エラー¶
標準¶
POSIX.1-2024.
履歴¶
POSIX.1-2001. Linux 2.6, glibc 2.1.
注意¶
t で指定された時間間隔が正確に基本クロックの粒度の倍数でない場合 (time(7) 参照)、その時間間隔は次の倍数に切り上げられます。さらに、停止が完了した後、CPU が再び呼び出したスレッドを実行できるようになるまでには、まだ遅延が存在する可能性があります。
絶対値指定のタイマーを使うのは、 nanosleep(2) に書かれている類のタイマーのずれの問題を防止するのに役立ちます(この種の問題は、シグナルに割り込まれた際に相対指定の停止を 繰り返し再開しようとするプログラムでは、かえって悪化します)。これらの問題を回避して相対指定の停止を実行するには、 希望するクロックで clock_gettime(2) を呼び出し、その返り値の時刻値に希望する期間を加算してから、 TIMER_ABSTIME フラグを指定して clock_nanosleep() を呼び出します。
sigaction(2) で SA_RESTART フラグが指定されているかに関わらず、シグナルハンドラーにより割り込まれた後に clock_nanosleep() が再開されることはありえません。
flags が TIMER_ABSTIME の場合、 remain 引数は使用されず、不要です(絶対値での停止では、同じ t 引数を使って再度呼び出すことができます)。
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), timespec(3), usleep(3), time(7)
| 2025-10-29 | Linux man-pages (未リリース) |