名 前
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 の 時 間 を 取 得 ま た は 設 定 す る 。
res と tp 引 き 数 は 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 が ア ク セ ス 可 能 な ア ド レ ス 空 間 の 外 を 指 し た 。
指 定 さ れ た clk_id が こ の シ ス テ ム で サ ポ ー ト さ れ て い な い 。 ロ ッ ク を 設 定 す る 権 限 が clock_settime() に な い 。 バ ー ジ ョ ンこ れ ら の シ ス テ ム コ ー ル は Linux 2.6 で 初 め て 登 場 し た 。 準 拠SUSv2, POSIX.1−2001. 可 用 性こ れ ら の 関 数 が 利 用 可 能 な POSIX シ ス テ ム で は 、 <unistd.h> に お い て シ ン ボ ル _POSIX_TIMERS が 0 よ り 大 き い 値 に 定 義 さ れ て い る 。 シ ン ボ ル _POSIX_MONOTONIC_CLOCK, _POSIX_CPUTIME, _POSIX_THREAD_CPUTIME は CLOCK_MONOTONIC, CLOCK_PROCESS_CPUTIME_ID, CLOCK_THREAD_CPUTIME_ID が 利 用 可 能 な こ と を 示 す 。 (sysconf(3) も 参 照 す る こ と 。 ) 注 意SMP シ
ス テ ム に 関 す
る 歴 史 的 な 注
意 事 項 SMP シ ス テ ム の 各 CPU が 別 々 の ク ロ ッ ク 源 を 持 つ 場 合 、 タ イ マ ー レ ジ ス タ ー 間 の 相 互 関 係 を 管 理 す る 方 法 は な い 。 こ れ は 各 CPU が 微 妙 に 異 な る 周 波 数 で 動 作 す る た め で あ る 。 こ れ が 真 実 の 場 合 (訳 註 : 各 CPU が 別 々 の ク ロ ッ ク 源 を 持 つ 場 合 )、 clock_getcpuclockid(0) は ENOENT を 返 し て 、 そ の 状 況 を 表 す 。 2 つ の ク ロ ッ ク は 、 プ ロ セ ス が 特 定 の CPU 上 に 留 ま っ て い る こ と が 保 証 で き る 場 合 に の み 有 効 で あ る 。 SMP シ ス テ ム の 各 プ ロ セ ッ サ は 全 く 同 じ 時 刻 に 起 動 す る 訳 で は な い の で 、 各 タ イ マ ー レ ジ ス タ ー は 通 常 は あ る オ フ セ ッ ト で 動 作 し て い る 。 オ フ セ ッ ト を ブ ー ト 時 に 制 限 す る コ ー ド が 含 ま れ る ア ー キ テ ク チ ャ ー も あ る 。 し か し 、 こ の コ ー ド が オ フ セ ッ ト を 正 確 に 調 整 す る こ と は 保 証 で き な い 。 glibc は (Linux カ ー ネ ル と は 異 な り ) オ フ セ ッ ト を 扱 う た め の コ ー ド を 提 供 し な い 。 通 常 は こ れ ら の オ フ セ ッ ト が 小 さ い の で 、 多 く の 場 合 で そ の 影 響 は 無 視 で き る 。 glibc 2.4 以 降 で は 、 こ の ペ ー ジ で 説 明 し た シ ス テ ム コ ー ル の ラ ッ パ ー 関 数 は 、 CLOCK_PROCESS_CPUTIME_ID と CLOCK_THREAD_CPUTIME_ID の カ ー ネ ル 実 装 が 利 用 で き る シ ス テ ム (す な わ ち Linux 2.6.12 以 降 ) で は カ ー ネ ル 実 装 を 利 用 す る こ と で 、 上 述 の 問 題 を 回 避 し て い る 。 バ グPOSIX.1−2001 で は 、 「 適 切 な 特 権 (appropriate privileges)」 を 持 っ た プ ロ セ ス は 、 clock_settime() を 使 っ て 、 ク ロ ッ ク CLOCK_PROCESS_CPUTIME_ID と CLOCK_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/ に 書 か れ て い る 。 |