Manpages

名 前

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 を 返 し 、 errnoEINTR を 設 定 し 、 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 そ の ス レ ッ ド に 配 送 さ れ た シ グ ナ ル に よ り 停 止 が 中 断 さ れ た 。 ス レ ッ ド が 簡 単 に

nanosleep() を 再 び 呼 び 出 し て 停 止 を 続 け る こ と が で き る よ う に 、 残 り の 停 止 時 間 が *rem に 格 納 さ れ る 。

EINVAL

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

準 拠

POSIX.1−2001.

注 意

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 に 基 づ く サ ー ビ ス に よ り 相 対 的 な 期 間 だ け 実 行 を 停 止 す る ス レ ッ ド に は 影 響 は な い 。 結 果 と し て 、 ク ロ ッ ク 値 が 更 新 前 か 後 か に 関 わ ら ず 、 要 求 さ れ た 相 対 的 な 時 間 が 経 過 す る と 満 了 す る こ と に な る 。 以 前 の 動 作

(例 え ば 、 時 間 が 重 要 な 意 味 を 持 つ ハ ー ド ウ ェ ア を 制 御 す る 場 合 な ど ) よ り 正 確 な 停 止 を 必 要 と す る ア プ リ ケ ー シ ョ ン に 対 応 す る た め に 、 nanosleep() は 、 マ イ ク ロ 秒 精 度 の ビ ジ ー ウ ェ イ ト を 利 用 す る こ と で 、 2 ms 以 下 の 停 止 を 行 う こ と が で き た 。 但 し 、 こ の 機 能 を 利 用 す る に は 、 呼 び 出 し 元 の ス レ ッ ド が SCHED_FIFOSCHED_RR と い っ た リ ア ル タ イ ム ポ リ シ ー の 元 で ス ケ ジ ュ ー リ ン グ さ れ て い る 必 要 が あ っ た 。 こ の 特 別 な 拡 張 は カ ー ネ ル 2.5.39 で 削 除 さ れ た 。 し た が っ て 、 現 在 の 2.4 系 列 の カ ー ネ ル に は こ の 機 能 が 存 在 す る が 、 2.6系 列 の カ ー ネ ル に は な い 。

バ グ

Linux 2.4 で は 、 nanosleep() が (SIGTSTP な ど の ) シ グ ナ ル に よ り 停 止 さ れ た 場 合 、 nanosleep() の 呼 び 出 し は SIGCONT シ グ ナ ル に よ る ス レ ッ ド の 再 開 後 に EINTR エ ラ ー で 失 敗 す る 。 シ ス テ ム コ ー ル が こ の 後 で 再 ス タ ー ト さ れ た 場 合 、 ス レ ッ ド が 停 止 状 態 に あ る 間 に 経 過 し た 時 間 は 停 止 期 間 と し て カ ウ ン ト 「 さ れ な い 」 。

関 連 項 目

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

こ の 文 書 に つ い て

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