名 前
clock_nanosleep − 指 定 し た ク ロ ッ ク で の 高 精 度 な 実 行 停 止 (sleep)
書 式
#include <time.h>
int
clock_nanosleep(clockid_t clock_id, int
flags,
const struct timespec *request,
struct timespec *remain);
−lrt と リ ン ク す る (バ ー ジ ョ ン 2.17 よ り 前 の glibc の み )
glibc 向 け の 機 能 検 査 マ ク ロ の 要 件 (feature_test_macros(7) 参 照 ):
clock_nanosleep():
_XOPEN_SOURCE >= 600 || _POSIX_C_SOURCE >= 200112L
説 明
clock_nanosleep() を 使 う と 、 nanosleep(2) 同 様 、 ナ ノ 秒 の 精 度 で 指 定 さ れ た 期 間 だ け 呼 び 出 し た ス レ ッ ド の 実 行 を 停 止 す る こ と が で き る 。 nanosleep(2) と 違 う の は 、 呼 び 出 し 側 が 停 止 期 間 を ど の ク ロ ッ ク に 対 し て 計 測 す る の か を 選 択 で き る 点 と 、 停 止 期 間 を 絶 対 値 で も 相 対 値 で も 指 定 で き る 点 で あ る 。 こ の シ ス テ ム コ ー ル に 渡 し た り 、 こ の シ ス テ ム コ ー ル が 返 し た り す る 時 間 の 値 は timespec 構 造 体 を 使 っ て 指 定 さ れ る 。 こ の 構 造 体 の 定 義 は 以 下 の 通 り で あ る 。
struct timespec
{
time_t tv_sec; /* seconds */
long tv_nsec; /* nanoseconds [0 .. 999999999] */ };
clock_id 引 き 数 で 、 停 止 期 間 を ど の ク ロ ッ ク に 対 し て 計 測 す る か を 指 定 す る 。 こ の 引 き 数 に は 以 下 の 値 の い ず れ か 一 つ を 指 定 で き る 。
CLOCK_REALTIME シ ス テ ム 全 体 で 使 わ れ る 実 時 間 ク ロ ッ ク 。 こ の ク ロ ッ ク は 変 更 可 能 で あ る 。 | |
CLOCK_MONOTONIC 過 去 の あ る 時 点 か ら の 時 間 を 計 測 す る 、 単 調 増 加 の ク ロ ッ ク 。 起 点 と な る 時 点 は シ ス テ ム 起 動 後 に は 変 更 さ れ な い 。 こ の ク ロ ッ ク は 変 更 す る こ と が で き な い 。 |
CLOCK_PROCESS_CPUTIME_ID そ の プ ロ セ ス の 全 ス レ ッ ド で 消 費 さ れ る CPU 時 間 を 計 測 す る プ ロ セ ス 単 位 の ク ロ ッ ク 。 こ の ク ロ ッ ク は 設 定 可 能 で あ る 。 こ れ ら の ク ロ ッ ク の 詳 細 は clock_getres(2) を 参 照 。 ま た 、 clock_getcpuclockid(3) と pthread_getcpuclockid(3) が 返 す CPU ク ロ ッ ク ID は clock_id に 渡 す こ と も で き る 。
flags が 0 の 場 合 、 request に 指 定 さ れ た 値 は clock_id で 指 定 さ れ た ク ロ ッ ク の 現 在 の 値 か ら の 相 対 的 な 期 間 と 解 釈 さ れ る 。
flags が TIMER_ABSTIME の 場 合 、 request は 指 定 さ れ た ク ロ ッ ク で 計 測 さ れ る 絶 対 時 刻 と 解 釈 さ れ る 。 request が 指 定 さ れ た ク ロ ッ ク の 現 在 の 値 以 下 の 場 合 、 clock_nanosleep() は 、 呼 び 出 し た ス レ ッ ド の 停 止 を 行 わ ず 、 す ぐ に 返 る 。
clock_nanosleep() は 、 少 な く と も request で 指 定 さ れ た 時 間 が 経 過 す る ま で 、 呼 び 出 し た ス レ ッ ド の 実 行 を 停 止 す る 。 シ グ ナ ル ハ ン ド ラ ー が 呼 び 出 さ れ た り 、 そ の プ ロ セ ス を 終 了 さ せ る よ う な シ グ ナ ル が 配 送 さ れ た り し た 場 合 に も 、 ス レ ッ ド の 実 行 停 止 は 終 了 す る 。 呼 び 出 し が シ グ ナ ル ハ ン ド ラ ー に よ っ て 割 り 込 ま れ た 場 合 、 clock_nanosleep() は エ ラ ー EINTR で 失 敗 す る 。 さ ら に 、 remain が NULL で な く 、 か つ flags が TIMER_ABSTIME で な い 場 合 に は 、 remain に 残 り の 停 止 時 間 が 返 さ れ る 。 こ の 値 を 使 っ て clock_nanosleep() を 再 度 呼 び 出 す こ と で 、 (相 対 的 な 期 間 の ) 停 止 を 完 了 す る こ と が で き る 。
返 り 値
要 求 さ れ た 期 間 の 停 止 に 成 功 す る と 、 clock_nanosleep() は 0 を 返 す 。 シ グ ナ ル ハ ン ド ラ ー で 割 り 込 ま れ た り 、 エ ラ ー が 発 生 し た り し た 場 合 、 「 エ ラ ー 」 の 節 の リ ス ト に あ る 正 の エ ラ ー 番 号 の い ず れ か 一 つ を 返 す 。
エ ラ ー
EFAULT |
request や remain に 無 効 な ア ド レ ス が 指 定 さ れ た 。 |
|||
EINTR |
停 止 が シ グ ナ ル ハ ン ド ラ ー に よ り 割 り 込 ま れ た 。
EINVAL |
tv_nsec フ ィ ー ル ド の 値 が 0 か ら 999999999 の 範 囲 で な い か 、 tv_sec の 値 が 負 で あ っ た 。 | ||
EINVAL |
clock_id が 無 効 で あ っ た (CLOCK_THREAD_CPUTIME_ID が clock_id と し て 有 効 な 値 で は な い )。 |
バ ー ジ ョ ン
clock_nanosleep() シ ス テ ム コ ー ル は Linux 2.6 で 初 め て 登 場 し た 。 glibc で は バ ー ジ ョ ン 2.1 以 降 で サ ポ ー ト さ れ て い る 。
準 拠
POSIX.1−2001.
注 意
request で 指 定 さ れ た 停 止 期 間 が 、 時 間 の 計 測 に 使 用 さ れ る ク ロ ッ ク (time(7) 参 照 ) の 精 度 の 倍 数 ち ょ う ど で な い 場 合 、 停 止 期 間 は 一 番 近 い 次 の 倍 数 に 切 り 上 げ ら れ る 。 さ ら に 、 停 止 が 完 了 し た 後 に 、 CPU が 呼 び 出 し た ス レ ッ ド を も う 一 度 実 行 で き る よ う に な る ま で に は 、 遅 延 が 入 る 可 能 性 が あ る 。 絶 対 値 指 定 の タ イ マ ー を 使 う の は 、 nanosleep(2) に 書 か れ て い る 類 の タ イ マ ー の ず れ の 問 題 を 防 止 す る の に 役 立 つ (こ の 種 の 問 題 は 、 シ グ ナ ル に 割 り 込 ま れ た 際 に 相 対 指 定 の 停 止 を 繰 り 返 し 再 開 し よ う と す る プ ロ グ ラ ム で は 、 か え っ て 悪 化 す る )。 こ れ ら の 問 題 を 回 避 し て 相 対 指 定 の 停 止 を 実 行 す る に は 、 希 望 す る ク ロ ッ ク で clock_gettime(2) を 呼 び 出 し 、 そ の 返 り 値 の 時 刻 値 に 希 望 す る 期 間 を 加 算 し て か ら 、 TIMER_ABSTIME フ ラ グ を 指 定 し て clock_nanosleep() を 呼 び 出 す 。
sigaction(2) で SA_RESTART フ ラ グ が 指 定 さ れ て い る か に 関 わ ら ず 、 シ グ ナ ル ハ ン ド ラ ー に よ り 割 り 込 ま れ た 後 に clock_nanosleep() が 再 開 さ れ る こ と は 決 し て な い 。
flags が TIMER_ABSTIME の 場 合 、 remain 引 き 数 は 使 用 さ れ ず 、 不 要 で あ る (絶 対 値 で の 停 止 で は 、 同 じ request 引 き 数 を 使 っ て 再 度 呼 び 出 す こ と が で き る )。
POSIX.1 の 規 定 で は 、 clock_nanosleep() は シ グ ナ ル の 処 理 方 法 や シ グ ナ ル マ ス ク に 影 響 を 与 え な い 、 と さ れ て い る 。
POSIX.1 の 規 定 で は 、 clock_settime(2) で CLOCK_REALTIME ク ロ ッ ク の 値 を 変 更 し た 後 は 、 絶 対 値 指 定 の clock_nanosleep() で 停 止 し て い る ス レ ッ ド を 起 動 さ せ る 時 刻 の 判 定 は 、 新 し い ク ロ ッ ク 値 を 使 っ て 行 わ れ る 、 と さ れ て い る 。 新 し い ク ロ ッ ク 値 に お い て 停 止 期 間 の 終 了 時 刻 が 過 去 に な っ て し ま っ た 場 合 に は 、 clock_nanosleep() は す ぐ に 返 る こ と に な る 。
POSIX.1 の 規 定 で は 、 clock_settime(2) で CLOCK_REALTIME ク ロ ッ ク の 値 を 変 更 し て も 、 相 対 値 指 定 の clock_nanosleep() で 停 止 し て い る ス レ ッ ド に は 影 響 を 与 え な い 、 と さ れ て い る 。
関 連 項 目
clock_getres(2), nanosleep(2), restart_syscall(2), timer_create(2), sleep(3), usleep(3), time(7)
こ の 文 書 に つ い て
こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。