Manpages

名 前

clock_getres, clock_gettime, clock_settime − ク ロ ッ ク と 時 間 の 関 数

書 式

#include <time.h>

int clock_getres(clockid_t clk_id, struct timespec *res);

int clock_gettime(clockid_t clk_id, struct timespec *tp);

int clock_settime(clockid_t clk_id, const struct timespec *tp);

−lrt と リ ン ク す る (バ ー ジ ョ ン 2.17 よ り 前 の glibc の み )

glibc 向 け の 機 能 検 査 マ ク ロ の 要 件 (feature_test_macros(7) 参 照 ):

clock_getres(), clock_gettime(), clock_settime():

_POSIX_C_SOURCE >= 199309L

説 明

関 数 clock_getres() は 指 定 さ れ た ク ロ ッ ク clk_id の 分 解 能 (精 度 ) を 探 し 出 す 。 res が NULL で な い 場 合 、 そ の 分 解 能 を res で 指 さ れ る struct timespec に 格 納 す る 。 ク ロ ッ ク の 分 解 能 は 実 装 に 依 存 し 、 特 定 の プ ロ セ ス に よ っ て 設 定 す る こ と は で き な い 。 clock_settime() の 引 き 数 tp で 指 さ れ る 時 間 の 値 が res の 倍 数 で な い 場 合 、 res の 倍 数 に 切 り 詰 め ら れ る 。 関 数 clock_gettime() と clock_settime() は 、 指 定 さ れ た ク ロ ッ ク clk_id の 時 間 を 取 得 ま た は 設 定 す る 。

restp 引 き 数 は timespec 構 造 体 で あ り 、 <time.h> で 以 下 の よ う に 規 定 さ れ て い る :

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

clk_id 引 き 数 は 特 定 の ク ロ ッ ク の 識 別 子 で あ り 、 そ の ク ロ ッ ク で 動 作 す る 。 ク ロ ッ ク は シ ス テ ム 全 体 に 適 用 す る こ と も で き 、 そ の 場 合 は 全 て の プ ロ セ ス か ら 見 る こ と が で き る 。 ま た 1 つ の プ ロ セ ス 内 で の み 時 間 を 計 測 す る 場 合 は 、 プ ロ セ ス 毎 に 適 用 す る こ と も で き る 。 全 て の 実 装 に お い て シ ス テ ム 全 体 の リ ア ル タ イ ム ク ロ ッ ク が サ ポ ー ト さ れ 、 CLOCK_REALTIME で 識 別 さ れ る 。 時 間 は 紀 元 (the Epoch) か ら の 秒 と ナ ノ 秒 で 表 さ れ る 。 時 間 が 変 更 さ れ た 場 合 、 相 対 的 な 時 間 間 隔 の タ イ マ ー は 影 響 を 受 け な い が 、 絶 対 的 な 時 点 の タ イ マ ー は 影 響 を 受 け る 。 さ ら に い く つ か の ク ロ ッ ク が 実 装 さ れ て い る か も し れ な い 。 対 応 す る 時 間 の 値 を 解 釈 す る 方 法 と タ イ マ ー へ の 影 響 は 、 定 め ら れ て い な い 。

glibc と Linux カ ー ネ ル の 最 新 の バ ー ジ ョ ン で は 、 以 下 の ク ロ ッ ク が サ ポ ー ト さ れ て い る 。
CLOCK_REALTIME
実 時 間 を 計 測 す る シ ス テ ム 全 体 で 一 意 な 時 間 。 こ の ク ロ ッ ク を 設 定 す る に は 適 切 な 特 権 が 必 要 で あ る 。 こ の ク ロ ッ ク は 、 シ ス テ ム 時 間 の 不 連 続 な 変 化 (例 え ば 、 シ ス テ ム 管 理 者 が シ ス テ ム 時 間 を 手 動 で 変 更 し た 場 合 な ど ) や adjtime や NTP が 行 う 段 階 的 な 調 整 の 影 響 を 受 け る 。
CLOCK_REALTIME_COARSE
(Linux 2.6.32 以 降 ; Linux 特 有 ) 高 速 だ が 精 度 が 低 い CLOCK_REALTIME。 速 度 が 非 常 に 必 要 で 、 か つ 高 精 度 の タ イ ム ス タ ン プ が 不 要 な 場 合 に 使 用 す る と よ い 。

CLOCK_MONOTONIC 設 定 す る こ と が で き な い ク ロ ッ ク で 、 あ る 開 始 時 点 か ら の 単 調 増 加 の 時 間 で 表 現 さ れ る ク ロ ッ ク (開 始 時 点 が ど の 時 点 と な る か は 規 定 さ れ て い な い )。 こ の 時 計 は 、 シ ス テ ム 時 間 の 不 連 続 な 変 化 (例 え ば 、 シ ス テ ム 管 理 者 が シ ス テ ム 時 間 を 手 動 で 変 更 し た 場 合 な ど ) の 影 響 を 受 け な い が 、 adjtime(3) や NTP が 行 う 段 階 的 な 調 整 の 影 響 を 受 け る 。
CLOCK_MONOTONIC_COARSE
(Linux 2.6.32 以 降 ; Linux 特 有 ) 高 速 だ が 精 度 が 低 い CLOCK_MONOTONIC。 速 度 が 非 常 に 必 要 で 、 か つ 高 精 度 の タ イ ム ス タ ン プ が 不 要 な 場 合 に 使 用 す る と よ い 。
CLOCK_MONOTONIC_RAW
(Linux 2.6.28 以 降 ; Linux 特 有 )

CLOCK_MONOTONIC と 同 様 だ が 、 NTP に よ る 調 整 や adjtime(3) が 行 う 段 階 的 な 調 整 の 影 響 を 受 け な い 、 ハ ー ド ウ ェ ア に よ る 生 の 時 刻 へ の ア ク セ ス が で き る 。

CLOCK_BOOTTIME (Linux 2.6.39 以 降 ; Linux 固 有 )

CLOCK_MONOTONIC と 同 じ だ が 、 シ ス テ ム が サ ス ペ ン ド さ れ て い る 時 間 も 含 ま れ る 点 が 異 な る 。 こ れ を 使 う と 、 ア プ リ ケ ー シ ョ ン は サ ス ペ ン ド 状 態 も 扱 え る "monotonic" な ク ロ ッ ク を 得 る こ と が で き る 。 し か も 、 CLOCK_REALTIME に お け る 複 雑 な 処 理 を 行 う 必 要 も な く な る 。 CLOCK_REALTIME で は 、 settimeofday(2) を 使 っ て 時 刻 を 変 更 し た 場 合 、 時 刻 に 不 連 続 な 変 化 が 発 生 す る か ら だ 。

CLOCK_PROCESS_CPUTIME_ID (Linux 2.6.12 以 降 ) プ ロ セ ス 単 位 の CPU タ イ ム ク ロ ッ ク (そ の プ ロ セ ス の 全 ス レ ッ ド で 消 費 さ れ る CPU 時 間 を 計 測 す る )。
CLOCK_THREAD_CPUTIME_ID
(Linux 2.6.12 以 降 ) ス レ ッ ド 固 有 の CPU タ イ ム ク ロ ッ ク 。

返 り 値

clock_gettime(), clock_settime(), clock_getres() は 成 功 し た 場 合 に 0 を 返 し 、 失 敗 し た 場 合 に −1 を 返 す (失 敗 し た 場 合 、 errno が 適 切 に 設 定 さ れ る )。

エ ラ ー

EFAULT

tp が ア ク セ ス 可 能 な ア ド レ ス 空 間 の 外 を 指 し た 。

EINVAL

指 定 さ れ た clk_id が こ の シ ス テ ム で サ ポ ー ト さ れ て い な い 。

EPERM 指 示 さ れ た ク

ロ ッ ク を 設 定 す る 権 限 が clock_settime() に な い 。

バ ー ジ ョ ン

こ れ ら の シ ス テ ム コ ー ル は Linux 2.6 で 初 め て 登 場 し た 。

準 拠

SUSv2, POSIX.1−2001.

可 用 性

こ れ ら の 関 数 が 利 用 可 能 な POSIX シ ス テ ム で は 、 <unistd.h> に お い て シ ン ボ ル _POSIX_TIMERS が 0 よ り 大 き い 値 に 定 義 さ れ て い る 。 シ ン ボ ル _POSIX_MONOTONIC_CLOCK, _POSIX_CPUTIME, _POSIX_THREAD_CPUTIMECLOCK_MONOTONIC, CLOCK_PROCESS_CPUTIME_ID, CLOCK_THREAD_CPUTIME_ID が 利 用 可 能 な こ と を 示 す 。 (sysconf(3) も 参 照 す る こ と 。 )

注 意

SMP シ ス テ ム に 関 す る 歴 史 的 な 注 意 事 項
Linux が CLOCK_PROCESS_CPUTIME_IDCLOCK_THREAD_CPUTIME_ID ク ロ ッ ク の カ ー ネ ル に よ る サ ポ ー ト を 追 加 す る 前 は 、 glibc は こ れ ら の ク ロ ッ ク は 多 く の プ ラ ッ ト フ ォ ー ム で CPU の タ イ マ ー レ ジ ス タ ー (i386 上 の TSC、 Itanium 上 の AR.ITC) を 用 い て 実 現 さ れ て い た 。 こ れ ら の レ ジ ス タ ー は CPU 間 で 異 な る 可 能 性 が あ り 、 プ ロ セ ス が 他 の CPU に 移 動 さ せ ら れ た 場 合 、 結 果 と し て こ れ ら の ク ロ ッ ク が 偽 の 結 果 (bogus results) を 返 す か も し れ な い 。

SMP シ ス テ ム の 各 CPU が 別 々 の ク ロ ッ ク 源 を 持 つ 場 合 、 タ イ マ ー レ ジ ス タ ー 間 の 相 互 関 係 を 管 理 す る 方 法 は な い 。 こ れ は 各 CPU が 微 妙 に 異 な る 周 波 数 で 動 作 す る た め で あ る 。 こ れ が 真 実 の 場 合 (訳 註 : 各 CPU が 別 々 の ク ロ ッ ク 源 を 持 つ 場 合 )、 clock_getcpuclockid(0)ENOENT を 返 し て 、 そ の 状 況 を 表 す 。 2 つ の ク ロ ッ ク は 、 プ ロ セ ス が 特 定 の CPU 上 に 留 ま っ て い る こ と が 保 証 で き る 場 合 に の み 有 効 で あ る 。

SMP シ ス テ ム の 各 プ ロ セ ッ サ は 全 く 同 じ 時 刻 に 起 動 す る 訳 で は な い の で 、 各 タ イ マ ー レ ジ ス タ ー は 通 常 は あ る オ フ セ ッ ト で 動 作 し て い る 。 オ フ セ ッ ト を ブ ー ト 時 に 制 限 す る コ ー ド が 含 ま れ る ア ー キ テ ク チ ャ ー も あ る 。 し か し 、 こ の コ ー ド が オ フ セ ッ ト を 正 確 に 調 整 す る こ と は 保 証 で き な い 。 glibc は (Linux カ ー ネ ル と は 異 な り ) オ フ セ ッ ト を 扱 う た め の コ ー ド を 提 供 し な い 。 通 常 は こ れ ら の オ フ セ ッ ト が 小 さ い の で 、 多 く の 場 合 で そ の 影 響 は 無 視 で き る 。

glibc 2.4 以 降 で は 、 こ の ペ ー ジ で 説 明 し た シ ス テ ム コ ー ル の ラ ッ パ ー 関 数 は 、 CLOCK_PROCESS_CPUTIME_IDCLOCK_THREAD_CPUTIME_ID の カ ー ネ ル 実 装 が 利 用 で き る シ ス テ ム (す な わ ち Linux 2.6.12 以 降 ) で は カ ー ネ ル 実 装 を 利 用 す る こ と で 、 上 述 の 問 題 を 回 避 し て い る 。

バ グ

POSIX.1−2001 で は 、 「 適 切 な 特 権 (appropriate privileges)」 を 持 っ た プ ロ セ ス は 、 clock_settime() を 使 っ て 、 ク ロ ッ ク CLOCK_PROCESS_CPUTIME_IDCLOCK_THREAD_CPUTIME_ID を 設 定 す る こ と が で き る と さ れ て い る 。 Linux で は 、 こ れ ら の ク ロ ッ ク は 設 定 可 能 で は な い (す な わ ち 、 ど の プ ロ セ ス も 「 適 切 な 特 権 」 を 持 た な い )。

関 連 項 目

date(1), gettimeofday(2), settimeofday(2), time(2), adjtime(3), clock_getcpuclockid(3), ctime(3), ftime(3), pthread_getcpuclockid(3), sysconf(3), time(7)

こ の 文 書 に つ い て

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