NANOSLEEP
Section: Linux Programmer's Manual (2)
Updated: 2007-07-26
Index
JM Home Page
roff page
名前
nanosleep - 指定された時間の間、実行を停止する
書式
#include <time.h>
int nanosleep(const struct timespec *req, struct timespec *rem);
glibc 向けの機能検査マクロの要件
(feature_test_macros(7)
参照):
nanosleep():
_POSIX_C_SOURCE >= 199309L
説明
nanosleep()
は、少なくとも
*req
で指定された時間の間、プログラムの実行を遅延させる。
プロセスにシグナルが配送された場合には、
指定された時間に達しなくても返ることがある。
この場合は -1 を返し、errno に
EINTR
を設定し、さらに
rem
が NULL でなければ
rem
が指している構造体に残りの時間を格納する。
*rem
の値を使うと、
nanosleep()
をもう一度呼び出して、指定した時間の停止を
完了させることができる。
ナノ秒刻みの時間間隔を指定するのに
timespec
構造体が使用される。この構造体は
<time.h>
に定義されており、以下のような形式である:
-
time_t tv_sec; /* 秒 */
long tv_nsec; /* ナノ秒 */
};
ナノ秒のフィールドの値は 0 から 999999999 の範囲になければならない。
sleep(3)
や
usleep(3)
に比べると
nanosleep()
には以下の利点がある:
- *
-
シグナルの影響を受けない。
- *
-
POSIX によって標準化された関数である。
- *
-
より高い時間分解能が提供されている。
- *
-
シグナルによって中断された後に、さらに停止を続けることが簡単である。
返り値
要求された期間の停止に成功した場合、
nanosleep()
は 0 を返す。呼び出しがシグナルハンドラにより割り込まれたり、
エラーが発生した場合は、-1 を返し、
errno
にエラー内容を示す値を設定する。
エラー
- EFAULT
-
ユーザ空間からの情報のコピーで問題があった。
- EINTR
-
禁止 (block) されていないシグナルがプロセスに配送されて、
停止が中断された。
プロセスが簡単に
nanosleep()
を再び呼び出して停止を続けることができるように、
残りの停止時間が *rem に格納される。
- EINVAL
-
tv_nsec
フィールドの値が 0 から 999999999 までの範囲になかったか、
tv_sec
が負であった。
準拠
POSIX.1-2001.
バグ
現在の
nanosleep()
の実装は普通のカーネルのタイマ機構に基づいている。カーネルのタイマ機構は
1/HZ 秒の分解能をもっている
(time(7)
参照)。このため、
nanosleep()
は少なくとも指定された時間必ず停止するが、プロセスが再び実行できる
ようになるまでに指定された時間より最大 10 ms 余計にかかる。同じ理由で、
シグナルが配送された場合に *rem に入れて返される値は、通常
実際の値より小さくない最小の 1/HZ 秒の倍数に切り上げられる。
以前の動作
(例えば、時間が重要な意味を持つハードウェアを制御する場合など)
より正確な停止を必要とするアプリケーションに対応するために、
nanosleep()
は、マイクロ秒精度のビジー・ウェイトを利用することで、
2 ms 以下の停止を行うことができた。
但し、この機能を利用するには、呼び出し元のプロセスが
SCHED_FIFO
や
SCHED_RR
といったリアルタイム・ポリシーの元でスケジューリングされている
必要があった。
この特別な拡張はカーネル 2.5.39 で削除された。したがって、
現在の 2.4 系列のカーネルにはこの機能が存在するが、
2.6系列のカーネルにはない。
Linux 2.4 では、
nanosleep()
が
(SIGTSTP
などの) シグナルにより停止された場合、
nanosleep()
の呼び出しは
SIGCONT
シグナルによるプロセスの再開後に
EINTR
エラーで失敗する。
システムコールがこの後で再スタートされた場合、
プロセスが停止状態にある間に経過した時間は
停止期間としてカウント「されない」。
関連項目
sched_setscheduler(2),
sleep(3),
timer_create(3),
usleep(3),
time(7)
Index
- 名前
-
- 書式
-
- 説明
-
- 返り値
-
- エラー
-
- 準拠
-
- バグ
-
- 以前の動作
-
- 関連項目
-
This document was created by
man2html,
using the manual pages.
Time: 04:31:54 GMT, November 19, 2007