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 を返し、errnoEINTR を設定し、さらに 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_FIFOSCHED_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