NANOSLEEP(2) | Linux Programmer's Manual | NANOSLEEP(2) |
名前
nanosleep -高精度なスリープ書式
#include <time.h>glibc 向けの機能検査マクロの要件 ( feature_test_macros(7) 参照):
説明
nanosleep() は、少なくとも *req で指定された時間の間、プログラムの実行を遅延させる。 nanosleep() は、呼び出したスレッドの実行を、少なくとも *req で指定された時間の間、もしくは呼び出したスレッドでハンドラの起動のきっかけとなるシグナル、またはプロセスを終了させるシグナルの配送が行われるまで一時停止する。struct timespec {
time_t tv_sec; /* 秒 */
long tv_nsec; /* ナノ秒 */
};
ナノ秒のフィールドの値は 0 から 999999999 の範囲になければならない。
sleep(3) や usleep(3) に比べると nanosleep() には以下のような利点がある: 停止期間の指定に関して高い時間分解能が提供されている。シグナルと互いに影響を及ぼすことがないと POSIX.1 で明示的に規定されている。シグナルハンドラによって割り込まれた際に、停止を再開するのがより簡単にできる。
返り値
要求された期間の停止に成功した場合、 nanosleep() は 0 を返す。呼び出しがシグナルハンドラにより割り込まれたり、エラーが発生した場合は、-1 を返し、 errno にエラー内容を示す値を設定する。エラー
- EFAULT
- ユーザ空間からの情報のコピーで問題があった。
- EINTR
- そのスレッドに配送されたシグナルにより停止が中断された。スレッドが簡単に nanosleep() を再び呼び出して停止を続けることができるように、残りの停止時間が *rem に格納される。
- EINVAL
- tv_nsec フィールドの値が 0 から 999999999 の範囲でないか、 tv_sec の値が負であった。
準拠
POSIX.1-2001.注意
req で指定された期間が、内部で使用されるクロックの粒度の倍数になっていない場合、期間は一番近い倍数に切り上げられる。また、停止が完了した後、CPU が呼び出し元のスレッドを再び実行できるようになるまでには遅延が入る。clock_settime(2) 経由で CLOCK_REALTIME クロックの値を設定しても、 nanosleep() 関数などの CLOCK_REALTIME に基づくサービスにより相対的な期間だけ実行を停止するスレッドには影響はない。結果として、クロック値が更新前か後かに関わらず、要求された相対的な時間が経過すると満了することになる。
以前の動作
(例えば、時間が重要な意味を持つハードウェアを制御する場合など) より正確な停止を必要とするアプリケーションに対応するために、 nanosleep() は、マイクロ秒精度のビジー・ウェイトを利用することで、 2 ms 以下の停止を行うことができた。但し、この機能を利用するには、呼び出し元のスレッドが SCHED_FIFO や SCHED_RR といったリアルタイム・ポリシーの元でスケジューリングされている必要があった。この特別な拡張はカーネル 2.5.39 で削除された。したがって、現在の 2.4 系列のカーネルにはこの機能が存在するが、 2.6系列のカーネルにはない。バグ
Linux 2.4 では、 nanosleep() が ( SIGTSTP などの) シグナルにより停止された場合、 nanosleep() の呼び出しは SIGCONT シグナルによるスレッドの再開後に EINTR エラーで失敗する。システムコールがこの後で再スタートされた場合、スレッドが停止状態にある間に経過した時間は停止期間としてカウント「されない」。関連項目
clock_nanosleep(2), sched_setscheduler(2), timer_create(2), sleep(3), usleep(3), time(7)この文書について
この man ページは Linux man-pages プロジェクトのリリース 3.51 の一部である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。2009-01-19 | Linux |