glibc 2.17 より前は、Real-time library (librt,\ -lrt)
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
この呼び出しに渡される時刻値と、この呼び出しから返される時刻値は、timespec(3) 構造体を使用して指定されます。
clockid 引数で、停止期間をどのクロックに対して計測するかを指定します。この引数には以下の値のいずれか一つを指定できます。
これらのクロックの詳細は 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() を再度呼び出すことで、(相対的な期間の) 停止を完了することができます。
絶対値指定のタイマーを使うのは、 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() で停止しているスレッドには影響を与えない、とされています。