Manpages

名 前

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 で 指 定 さ れ た ク ロ ッ ク の 現 在 の 値 か ら の 相 対 的 な 期 間 と 解 釈 さ れ る 。

flagsTIMER_ABSTIME の 場 合 、 request は 指 定 さ れ た ク ロ ッ ク で 計 測 さ れ る 絶 対 時 刻 と 解 釈 さ れ る 。 request が 指 定 さ れ た ク ロ ッ ク の 現 在 の 値 以 下 の 場 合 、 clock_nanosleep() は 、 呼 び 出 し た ス レ ッ ド の 停 止 を 行 わ ず 、 す ぐ に 返 る 。

clock_nanosleep() は 、 少 な く と も request で 指 定 さ れ た 時 間 が 経 過 す る ま で 、 呼 び 出 し た ス レ ッ ド の 実 行 を 停 止 す る 。 シ グ ナ ル ハ ン ド ラ ー が 呼 び 出 さ れ た り 、 そ の プ ロ セ ス を 終 了 さ せ る よ う な シ グ ナ ル が 配 送 さ れ た り し た 場 合 に も 、 ス レ ッ ド の 実 行 停 止 は 終 了 す る 。 呼 び 出 し が シ グ ナ ル ハ ン ド ラ ー に よ っ て 割 り 込 ま れ た 場 合 、 clock_nanosleep() は エ ラ ー EINTR で 失 敗 す る 。 さ ら に 、 remain が NULL で な く 、 か つ flagsTIMER_ABSTIME で な い 場 合 に は 、 remain に 残 り の 停 止 時 間 が 返 さ れ る 。 こ の 値 を 使 っ て clock_nanosleep() を 再 度 呼 び 出 す こ と で 、 (相 対 的 な 期 間 の ) 停 止 を 完 了 す る こ と が で き る 。

返 り 値

要 求 さ れ た 期 間 の 停 止 に 成 功 す る と 、 clock_nanosleep() は 0 を 返 す 。 シ グ ナ ル ハ ン ド ラ ー で 割 り 込 ま れ た り 、 エ ラ ー が 発 生 し た り し た 場 合 、 「 エ ラ ー 」 の 節 の リ ス ト に あ る 正 の エ ラ ー 番 号 の い ず れ か 一 つ を 返 す 。

エ ラ ー

EFAULT

requestremain に 無 効 な ア ド レ ス が 指 定 さ れ た 。

EINTR

停 止 が シ グ ナ ル ハ ン ド ラ ー に よ り 割 り 込 ま れ た 。

EINVAL

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

EINVAL

clock_id が 無 効 で あ っ た (CLOCK_THREAD_CPUTIME_IDclock_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() が 再 開 さ れ る こ と は 決 し て な い 。

flagsTIMER_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/ に 書 か れ て い る 。