.\" Copyright (c) 2008, Linux Foundation, written by Michael Kerrisk .\" .\" .\" %%%LICENSE_START(VERBATIM) .\" Permission is granted to make and distribute verbatim copies of this .\" manual provided the copyright notice and this permission notice are .\" preserved on all copies. .\" .\" Permission is granted to copy and distribute modified versions of this .\" manual under the conditions for verbatim copying, provided that the .\" entire resulting derived work is distributed under the terms of a .\" permission notice identical to this one. .\" .\" Since the Linux kernel and libraries are constantly changing, this .\" manual page may be incorrect or out-of-date. The author(s) assume no .\" responsibility for errors or omissions, or for damages resulting from .\" the use of the information contained herein. The author(s) may not .\" have taken the same level of care in the production of this manual, .\" which is licensed free of charge, as they might when working .\" professionally. .\" .\" Formatted or processed versions of this manual, if unaccompanied by .\" the source, must acknowledge the copyright and authors of this work. .\" %%%LICENSE_END .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .\" .\" Japanese Version Copyright (c) 2008 Akihiro MOTOKI .\" all rights reserved. .\" Translated 2008-08-21, Akihiro MOTOKI , LDP v3.04 .\" .TH CLOCK_NANOSLEEP 2 " 2020\-04\-11" Linux "Linux Programmer's Manual" .SH 名前 clock_nanosleep \- 指定したクロックでの高精度な実行停止 (sleep) .SH 書式 \fB#include \fP .nf .PP \fBint clock_nanosleep(clockid_t \fP\fIclockid\fP\fB, int \fP\fIflags\fP\fB,\fP \fB const struct timespec *\fP\fIrequest\fP\fB,\fP \fB struct timespec *\fP\fIremain\fP\fB);\fP .fi .PP \fI\-lrt\fP とリンクする (バージョン 2.17 より前の glibc のみ) .PP .ad l .RS -4 glibc 向けの機能検査マクロの要件 (\fBfeature_test_macros\fP(7) 参照): .RE .PP \fBclock_nanosleep\fP(): .RS 4 _POSIX_C_SOURCE\ >=\ 200112L .RE .ad .SH 説明 \fBclock_nanosleep\fP() を使うと、 \fBnanosleep\fP(2) 同様、ナノ秒の精度で指定された期間だけ呼び出したスレッドの実行を 停止することができる。 \fBnanosleep\fP(2) と違うのは、呼び出し側が停止期間をどのクロックに対して計測するのかを選択 できる点と、停止期間を絶対値でも相対値でも指定できる点である。 .PP このシステムコールに渡したり、このシステムコールが返したりする時間の値は \fItimespec\fP 構造体を使って指定される。この構造体の定義は以下の通りである。 .PP .in +4n .EX struct timespec { time_t tv_sec; /* seconds */ long tv_nsec; /* nanoseconds [0 .. 999999999] */ }; .EE .in .PP .\" Look in time/posix-timers.c (kernel 5.6 sources) for the .\" 'struct k_clock' structures that have an 'nsleep' method \fIclockid\fP 引数で、停止期間をどのクロックに対して計測するかを指定する。 この引数には以下の値のいずれか一つを指定できる。 .TP \fBCLOCK_REALTIME\fP システム全体で使われる実時間クロック。 このクロックは変更可能である。 .TP \fBCLOCK_TAI\fP (Linux 3.10 以降) A system\-wide clock derived from wall\-clock time but ignoring leap seconds. .TP \fBCLOCK_MONOTONIC\fP .\" On Linux this clock measures time since boot. 過去のある時点からの時間を計測する、単調増加のクロック。 起点となる時点はシステム起動後には変更されない。 このクロックは変更することができない。 .TP \fBCLOCK_BOOTIME\fP (Linux 2.6.39 以降) Identical to \fBCLOCK_MONOTONIC\fP, except that it also includes any time that the system is suspended. .TP \fBCLOCK_PROCESS_CPUTIME_ID\fP .\" There is some trickery between glibc and the kernel .\" to deal with the CLOCK_PROCESS_CPUTIME_ID case. そのプロセスの全スレッドで消費される CPU 時間を計測するプロセス単位の クロック。このクロックは設定可能である。 .PP .\" Sleeping against CLOCK_REALTIME_ALARM and CLOCK_BOOTTIME_ALARM .\" is also possible (tested), with CAP_WAKE_ALARM, but I'm not .\" sure if this is useful or needs to be documented. これらのクロックの詳細は \fBclock_getres\fP(2) を参照。 また、 \fBclock_getcpuclockid\fP(3) と \fBpthread_getcpuclockid\fP(3) が返す CPU クロック ID は \fIclockid\fP に渡すこともできる。 .PP \fIflags\fP が 0 の場合、 \fIrequest\fP に指定された値は \fIclockid\fP で指定されたクロックの現在の値からの相対的な期間と解釈される。 .PP \fIflags\fP が \fBTIMER_ABSTIME\fP の場合、 \fIrequest\fP は指定されたクロック \fIclockid\fP で計測される絶対時刻と解釈される。 \fIrequest\fP が指定されたクロックの現在の値以下の場合、 \fBclock_nanosleep\fP() は、呼び出したスレッドの停止を行わず、すぐに返る。 .PP \fBclock_nanosleep\fP() は、少なくとも \fIrequest\fP で指定された時間が経過するまで、呼び出したスレッドの実行を停止する。 シグナルハンドラーが呼び出されたり、そのプロセスを終了させるような シグナルが配送されたりした場合にも、スレッドの実行停止は終了する。 .PP 呼び出しがシグナルハンドラーによって割り込まれた場合、 \fBclock_nanosleep\fP() はエラー \fBEINTR\fP で失敗する。さらに、 \fIremain\fP が NULL でなく、かつ \fIflags\fP が \fBTIMER_ABSTIME\fP でない場合には、 \fIremain\fP に残りの停止時間が返される。 この値を使って \fBclock_nanosleep\fP() を再度呼び出すことで、(相対的な期間の) 停止を完了することができる。 .SH 返り値 要求された期間の停止に成功すると、 \fBclock_nanosleep\fP() は 0 を返す。 シグナルハンドラーで割り込まれたり、エラーが発生したりした場合、 「エラー」の節のリストにある正のエラー番号のいずれか一つを返す。 .SH エラー .TP \fBEFAULT\fP \fIrequest\fP や \fIremain\fP に無効なアドレスが指定された。 .TP \fBEINTR\fP 停止がシグナルハンドラーにより割り込まれた。 \fBsignal\fP(7) 参照。 .TP \fBEINVAL\fP \fItv_nsec\fP フィールドの値が 0 から 999999999 の範囲でないか、 \fItv_sec\fP の値が負であった。 .TP \fBEINVAL\fP \fIclockid\fP が無効であった (\fBCLOCK_THREAD_CPUTIME_ID\fP が \fIclockid\fP として有効な値ではない)。 .TP \fBENOTSUP\fP The kernel does not support sleeping against this \fIclockid\fP. .SH バージョン \fBclock_nanosleep\fP() システムコールは Linux 2.6 で初めて登場した。 glibc ではバージョン 2.1 以降でサポートされている。 .SH 準拠 POSIX.1\-2001, POSIX.1\-2008. .SH 注意 \fIrequest\fP で指定された停止期間が、時間の計測に使用されるクロック (\fBtime\fP(7) 参照) の精度の倍数ちょうどでない場合、停止期間は一番近い次の倍数に 切り上げられる。さらに、停止が完了した後に、CPU が呼び出したスレッドを もう一度実行できるようになるまでには、遅延が入る可能性がある。 .PP 絶対値指定のタイマーを使うのは、 \fBnanosleep\fP(2) に書かれている類のタイマーのずれの問題を防止するのに役立つ (この種の問題は、シグナルに割り込まれた際に相対指定の停止を 繰り返し再開しようとするプログラムでは、かえって悪化する)。 これらの問題を回避して相対指定の停止を実行するには、 希望するクロックで \fBclock_gettime\fP(2) を呼び出し、その返り値の時刻値に希望する期間を加算してから、 \fBTIMER_ABSTIME\fP フラグを指定して \fBclock_nanosleep\fP() を呼び出す。 .PP \fBsigaction\fP(2) で \fBSA_RESTART\fP フラグが指定されているかに関わらず、シグナルハンドラーにより割り込まれた後に \fBclock_nanosleep\fP() が再開されることは決してない。 .PP \fIflags\fP が \fBTIMER_ABSTIME\fP の場合、 \fIremain\fP 引数は使用されず、不要である (絶対値での停止では、同じ \fIrequest\fP 引数を使って再度呼び出すことができる)。 .PP POSIX.1 の規定では、 \fBclock_nanosleep\fP() はシグナルの処理方法やシグナルマスクに影響を与えない、とされている。 .PP POSIX.1 の規定では、 \fBclock_settime\fP(2) で \fBCLOCK_REALTIME\fP クロックの値を変更した後は、絶対値指定の \fBclock_nanosleep\fP() で停止しているスレッドを起動させる時刻の判定は、 新しいクロック値を使って行われる、とされている。 新しいクロック値において停止期間の終了時刻が過去になってしまった場合には、 \fBclock_nanosleep\fP() はすぐに返ることになる。 .PP POSIX.1 の規定では、 \fBclock_settime\fP(2) で \fBCLOCK_REALTIME\fP クロックの値を変更しても、相対値指定の \fBclock_nanosleep\fP() で停止しているスレッドには影響を与えない、とされている。 .SH 関連項目 \fBclock_getres\fP(2), \fBnanosleep\fP(2), \fBrestart_syscall\fP(2), \fBtimer_create\fP(2), \fBsleep\fP(3), \fBusleep\fP(3), \fBtime\fP(7) .SH この文書について この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 5.10 の一部である。プロジェクトの説明とバグ報告に関する情報は \%https://www.kernel.org/doc/man\-pages/ に書かれている。