NANOSLEEP(2)

名前
nanosleep - 指定された時間の間、実行を停止(pause)する

書式
#include <time.h>

int nanosleep(const struct timespec *req, struct timespec *rem);

説明
nanosleep は少なくとも *req で指定された時間の間、プログラムの実行を遅らせる。 もしプロセスにシグナル(signal)が配送された場合にはより短い時間で返る。 この場合は -1 が返され、errno に EINTR が設定され、 rem が NULL でなければ残りの時間が rem が指している構造体に格納される。 *rem の値は指定された停止(pause)を完了させるために nanosleep を再び呼び出すのに使用できる。 timespec 構造体はナノ秒刻みの時間間隔を指定するのに使用さる。これは <time.h> に定義されており、以下のような形式である:

    struct timespec
    {
    	time_t	tv_sec;			/* seconds */
    	long	tv_nsec;		/* nanoseconds */
    };

ナノ秒のフィールドの値は 0 から 999 999 999 の範囲になければならない。 sleep(3) や usleep(3) に比べると nanosleep にはシグナルの影響を受けないとい、POSIX で標準化されている、 より高い時間分解能を提供する、シグナルによって中断された後に 停止(sleep)を続けることがより簡単であるなどの利点がある。

エラー
エラーや例外の場合は、 nanosleep システム・コールは 0 の替りに -1 を返し、 errno に以下の値のどれかを設定する:

EINTR
    停止(pause)が、禁止(block)されていないシグナルがプロセスに配送 されることで割り込まれた。 プロセスが簡単に nanosleep を再び呼び出して停止を続けることができるように、 残りの停止(sleep)時間が *rem に格納される。

EINVAL
    tv_nsec フィールドの値が 0 から 999 999 999 までの範囲にないか、 tv_sec が負である。

バグ
現在の nanosleep の実装では普通のカーネルのタイマー機構に基づいおり、それは 1/HZ 秒の分解能をもっている。(例えば Linux/i386 では 10 ms、 Linux/Alpha では 1 ms)。それで、 nanosleep は常に少なくとも指定された時間、停止(pause)するが、プロセスが再び実行できる ようになるまで指定された時間より最大で 10 ms よけいにかかる。同じ理由で シグナルが配送された場合に返される *rem はたいてい次のより大きい 1/HZ 秒の倍数に切り上げられる。 いくつかのアプリケーションではより細かな停止(pause)が必要となる。 (例えばある種の時間が重要なハードウェアを制御する場合など)、 nanosleep はより高い精度の停止も可能である。もしプロセスが SCHED_FIFO や SCHED_RR のよううなリアル・タイムH方針の元ででスケジュールされているならば、 2 ms 以下の停止ができ、マイクロ秒精度のビジー・ウェイトとして機能する。

準拠
POSIX.1b (以前の POSIX.4)

関連項目
sleep(3), usleep(3), sched_setscheduler(2), timer_create(2).