Man page - nanosleep(2)

Packages contains this manual

Available languages:

en fr pl ja ru ro

Manual

NANOSLEEP

名 前
書 式
説 明
返 り 値
エ ラ ー
準 拠
注 意
以 前 の 動 作
バ グ
関 連 項 目
こ の 文 書 に つ い て

名 前

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 で 指 定 さ れ た 時 間 の 間 、 プ ロ グ ラ ム の 実 行 を 遅 延 さ せ る 。 nanosleep () は 、 呼 び 出 し た ス レ ッ ド の 実 行 を 、 少 な く と も *req で 指 定 さ れ た 時 間 の 間 、 も し く は 呼 び 出 し た ス レ ッ ド で ハ ン ド ラ ー の 起 動 の き っ か け と な る シ グ ナ ル 、 ま た は プ ロ セ ス を 終 了 さ せ る シ グ ナ ル の 配 送 が 行 わ れ る ま で 一 時 停 止 す る 。

呼 び 出 し が シ グ ナ ル ハ ン ド ラ ー に よ り 割 り 込 ま れ た 場 合 、 nanosleep は -1 を 返 し 、 errno EINTR を 設 定 し 、 rem が NULL で な け れ ば 残 り の 時 間 を rem が 指 す 構 造 体 に 格 納 す る 。 *rem の 値 を 使 う と 、 nanosleep () を も う 一 度 呼 び 出 し て 、 指 定 し た 時 間 の 停 止 を 完 了 さ せ る こ と が で き る (但 し 、 「 注 意 」 の 節 を 参 照 の こ と )。

ナ ノ 秒 刻 み の 時 間 間 隔 を 指 定 す る の に timespec 構 造 体 が 使 用 さ れ る 。 こ の 構 造 体 は 次 の よ う に 定 義 さ れ て い る 。

struct timespec {
time_t tv_sec; /* 秒 */
long tv_nsec; /* ナ ノ 秒 */
};

ナ ノ 秒 の フ ィ ー ル ド の 値 は 0 か ら 999999999 の 範 囲 に な け れ ば な ら な い 。

sleep (3) や usleep (3) に 比 べ る と nanosleep () に は 以 下 の よ う な 利 点 が あ る : 停 止 期 間 の 指 定 に 関 し て 高 い 時 間 分 解 能 が 提 供 さ れ て い る 。 シ グ ナ ル と 互 い に 影 響 を 及 ぼ す こ と が な い と POSIX.1 で 明 示 的 に 規 定 さ れ て い る 。 シ グ ナ ル ハ ン ド ラ ー に よ っ て 割 り 込 ま れ た 際 に 、 停 止 を 再 開 す る の が よ り 簡 単 に で き る 。

返 り 値

要 求 さ れ た 期 間 の 停 止 に 成 功 し た 場 合 、 nanosleep () は 0 を 返 す 。 呼 び 出 し が シ グ ナ ル ハ ン ド ラ ー に よ り 割 り 込 ま れ た り 、 エ ラ ー が 発 生 し た 場 合 は 、 -1 を 返 し 、 errno に エ ラ ー 内 容 を 示 す 値 を 設 定 す る 。

エ ラ ー

EFAULT

ユ ー ザ ー 空 間 か ら の 情 報 の コ ピ ー で 問 題 が あ っ た 。

EINTR

そ の ス レ ッ ド に 配 送 さ れ た シ グ ナ ル に よ り 停 止 が 中 断 さ れ た ( signal (7) 参 照 )。 ス レ ッ ド が 簡 単 に nanosleep () を 再 び 呼 び 出 し て 停 止 を 続 け る こ と が で き る よ う に 、 残 り の 停 止 時 間 が *rem に 格 納 さ れ る 。

EINVAL

tv_nsec フ ィ ー ル ド の 値 が 0 か ら 999999999 の 範 囲 で な い か 、 tv_sec の 値 が 負 で あ っ た 。

準 拠

POSIX.1-2001, POSIX.1-2008.

注 意

req で 指 定 さ れ た 期 間 が 、 内 部 で 使 用 さ れ る ク ロ ッ ク の 粒 度 の 倍 数 に な っ て い な い 場 合 、 期 間 は 一 番 近 い 倍 数 に 切 り 上 げ ら れ る 。 ま た 、 停 止 が 完 了 し た 後 、 CPU が 呼 び 出 し 元 の ス レ ッ ド を 再 び 実 行 で き る よ う に な る ま で に は 遅 延 が 入 る 。

シ グ ナ ル に よ る 割 り 込 み 後 に 繰 り 返 し 再 開 さ れ た 場 合 、 nanosleep () の 停 止 が 相 対 的 な 期 間 で あ る こ と は 問 題 と な る こ と が あ る 。 こ れ は 、 呼 び 出 し の 割 り 込 み か ら 再 開 ま で の 間 の 時 間 が 原 因 で 停 止 が 最 終 的 に 完 了 し た 際 に 時 間 に ず れ が 発 生 す る か ら で あ る 。 こ の 問 題 は 、 絶 対 時 刻 が 指 定 で き る clock_nanosleep (2) を 使 う こ と で 回 避 で き る 。

POSIX.1 は 、 nanosleep () は CLOCK_REALTIME に 対 し て 時 刻 を 計 測 す る べ き だ と 規 定 し て い る 。 し か し な が ら 、 Linux は CLOCK_MONOTONIC ク ロ ッ ク を 用 い て 時 刻 を 計 測 し て い る 。 こ の こ と は お そ ら く 問 題 に な ら な い だ ろ う 。 な ぜ な ら 、 POSIX.1 の clock_settime (2) の 仕 様 に は 、 CLOCK_REALTIME の 不 連 続 な 変 化 は nanosleep () に 影 響 す べ き で は な い 、 と 書 か れ て い る か ら で あ る 。

clock_settime (2) 経 由 で CLOCK_REALTIME ク ロ ッ ク の 値 を 設 定 し て も 、 nanosleep () 関 数 な ど の CLOCK_REALTIME に 基 づ く サ ー ビ ス に よ り 相 対 的 な 期 間 だ け 実 行 を 停 止 す る ス レ ッ ド に は 影 響 は な い 。 結 果 と し て 、 ク ロ ッ ク 値 が 更 新 前 か 後 か に 関 わ ら ず 、 要 求 さ れ た 相 対 的 な 時 間 が 経 過 す る と 満 了 す る こ と に な る 。

以 前 の 動 作

In order to support applications requiring much more precise pauses (e.g., in order to control some time-critical hardware), nanosleep () would handle pauses of up to 2 milliseconds by busy waiting with microsecond precision when called from a thread scheduled under a real-time policy like SCHED_FIFO or SCHED_RR . This special extension was removed in kernel 2.5.39, and is thus not available in Linux 2.6.0 and later kernels.

バ グ

If a program that catches signals and uses nanosleep () receives signals at a very high rate, then scheduling delays and rounding errors in the kernel’s calculation of the sleep interval and the returned remain value mean that the remain value may steadily increase on successive restarts of the nanosleep () call. To avoid such problems, use clock_nanosleep (2) with the TIMER_ABSTIME flag to sleep to an absolute deadline.

In Linux 2.4, if nanosleep () is stopped by a signal (e.g., SIGTSTP ), then the call fails with the error EINTR after the thread is resumed by a SIGCONT signal. If the system call is subsequently restarted, then the time that the thread spent in the stopped state is not counted against the sleep interval. This problem is fixed in Linux 2.6.0 and later kernels.

関 連 項 目

clock_nanosleep (2), restart_syscall (2), sched_setscheduler (2), timer_create (2), sleep (3), usleep (3), time (7)

こ の 文 書 に つ い て

こ の man ペ ー ジ は Linux man-pages プ ロ ジ ェ ク ト の リ リ ー ス 5.10 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は https://www.kernel.org/doc/man-pages/ に 書 か れ て い る 。