clock_nanosleep

Section: System Calls (2)
Updated: 2025-10-29
Index JM Home Page roff page
 

名前

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);

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

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 で指定されたクロックの現在の値からの相対的な時間間隔と解釈されます。

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

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

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

返り値

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

エラー

EFAULT
requestremain に無効なアドレスが指定されました。
EINTR
停止がシグナルハンドラーにより割り込まれました。 signal(7) 参照。
EINVAL
tv_nsec フィールドの値が [0 から 999999999] の範囲でないか、 tv_sec の値が負でした。
EINVAL
clockid が無効でした (CLOCK_THREAD_CPUTIME_IDclockid として有効な値ではありません)。

 ENOTSUP
カーネルは、この clockid に対するスリープ機能をサポートしていません。
 

標準

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() が再開されることはありえません。

flagsTIMER_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)


 

Index

名前
ライブラリ
書式
説明
返り値
エラー
標準
履歴
注意
関連項目

This document was created by man2html, using the manual pages.