名 前
times − プ ロ セ ス 時 間 を 取 得 す る
書 式
#include <sys/times.h>
clock_t times(struct tms *buf);
説 明
times() は 現 在 の プ ロ セ ス 時 間 を buf が 指 し て い る struct tms に 格 納 す る 。 struct tms は <sys/times.h> で 以 下 の よ う に 定 義 さ れ て い る :
struct tms {
clock_t tms_utime; /* user time */
clock_t tms_stime; /* system time */
clock_t tms_cutime; /* user time of children */
clock_t tms_cstime; /* system time of children */ };
tms_utime フ ィ ー ル ド は 、 呼 び 出 し た プ ロ セ ス が 命 令 を 実 行 す る の に 消 費 し た CPU 時 間 で あ る 。 tms_stime フ ィ ー ル ド は 、 呼 び 出 し た プ ロ セ ス の た め に 実 行 さ れ た タ ス ク で 、 シ ス テ ム が 消 費 し た CPU 時 間 で あ る 。 tms_cutime フ ィ ー ル ド は 、 終 了 を 待 っ て い る 全 て の 子 プ ロ セ ス の tms_utime と tms_cutime の 合 計 で あ る 。 tms_cstime フ ィ ー ル ド は 、 終 了 を 待 っ て い る 全 て の 子 プ ロ セ ス の tms_stime と tms_cstime の 合 計 で あ る 。 終 了 す る 子 (及 び そ の 子 孫 )プ ロ セ ス の 時 間 は wait(2) や waitpid(2) が プ ロ セ ス ID を 返 し た 瞬 間 に 加 算 さ れ る 。 つ ま り 、 子 が ま だ 終 了 を 待 っ て い な い 状 態 で は 孫 プ ロ セ ス の 時 間 は 決 し て 現 れ な い 。 全 て の 時 間 は ク ロ ッ ク 数 で 返 さ れ る 。
返 り 値
times() は 過 去 の あ る 時 点 か ら 経 過 し た ク ロ ッ ク 数 (clock tick) を 返 す 。 こ の 返 り 値 は clock_t 型 が 取 り 得 る 範 囲 か ら オ ー バ ー フ ロ ー す る か も し れ な い 。 エ ラ ー の 場 合 、 (clock_t) −1 が 返 さ れ 、 errno が 適 切 に 設 定 さ れ る 。
エ ラ ー
EFAULT |
tms が プ ロ セ ス の ア ド レ ス 空 間 の 外 を 指 し て い る 。 |
準 拠
SVr4, 4.3BSD, POSIX.1−2001.
注 意
一 秒 あ た り の ク ロ ッ ク 数 は 以 下 で 得 る こ と が で き る 。
sysconf(_SC_CLK_TCK);
POSIX.1−1996 で は 、 CLK_TCK シ ン ボ ル (<time.h> で 定 義 さ れ て い る ) は 古 い も の で あ る と 記 述 さ れ て い る 。 今 で は こ れ は 古 い も の で あ る 。
Linux 2.6.9 よ り 前 の バ ー ジ ョ ン で は 、 SIGCHLD を SIG_IGN に 設 定 す る と 終 了 し た 子 プ ロ セ ス の 回 数 は 自 動 的 に tms_cstime と tms_cutime フ ィ ー ル ド に 含 ま れ る 。 し か し 、 POSIX.1−2001 で は 、 こ の 動 作 は 呼 び 出 し 元 が wait(2) 関 数 群 で 子 プ ロ セ ス を 待 っ た 場 合 に の み 起 き る べ き だ と し て い る 。 標 準 と は 異 な る こ の 動 作 は Linux 2.6.9 以 降 で 修 正 さ れ て い る 。
Linux で は 、 buf 引 数 に NULL を 指 定 す る こ と が で き 、 そ の 場 合 は times() は 単 に 関 数 の 結 果 を 返 す 。 し か し 、 POSIX は こ の 振 る 舞 い は 規 定 さ れ て お ら ず 、 そ の 他 の ほ と ん ど の UNIX 実 装 は buf の 値 と し て 非 NULL の 値 を 要 求 す る 。
clock(3) も clock_t 型 の 値 を 返 す が 、 こ の 値 は times() で 使 用 さ れ る ク ロ ッ ク tick 数 で は な く 、 CLOCKS_PER_SEC が 単 位 で あ る 点 に 注 意 す る こ と 。
Linux で
は 、 times() の 返 り
値 を 計 算 す る
起 点 と な る 「
過 去 の 任 意 の
時 点 」 は 、 カ
ー ネ ル の バ ー
ジ ョ ン に よ り
異 な る 。 Linux 2.4 以
前 で は 、 こ の
時 点 は シ ス テ
ム が 起 動 し た
瞬 間 で あ る 。 Linux
2.6 以 降 で は 、 こ
の 時 点 は シ ス
テ ム 起 動 時 刻
の (2^32/HZ) − 300 (お よ
び 4億 2900万 ) 秒 前 で
あ る 。 こ の よ
う に カ ー ネ ル
バ ー ジ ョ ン (や UNIX
の 実 装 ) に よ り
異 な る こ と と
、 返 り 値 が clock_t
の 範 囲 を オ ー
バ ー フ ロ ー す
る 可 能 性 が あ
る と い う 事 実
を 考 慮 す る と
、 移 植 性 が 必
要 な ア プ リ ケ
ー シ ョ ン で は
こ の 値 を 使 う
の は 避 け る の
が 賢 明 で あ ろ
う 。 経 過 時 間
を 測 り た い 場
合 に は 、 代 わ
り に clock_gettime(2) を 使
用 す る こ と 。
歴 史
SVr1−3 で は long を 返
し 、 構 造 体 の
メ ン バ に time_t 型
を 使 っ て い た
が 、 紀 元 か ら
の 秒 数 で は な
く ク ロ ッ ク 数
を 格 納 し て い
た 。 V7 で は 構 造
体 の メ ン バ に
long 型 を 使 っ て
い た 。 ま だ time_t
型 が な か っ た
か ら で あ る 。
バ グ
い く つ か の ア ー キ テ ク チ ャ ー (特 に i386) に お け る Linux の シ ス テ ム コ ー ル の 慣 習 の 制 限 に よ り 、 Linux 2.6 で は 起 動 直 後 は (41秒 と ) タ イ ム ウ ィ ン ド ウ が 小 さ く 、 times() が エ ラ ー が 起 こ っ た こ と を 示 す −1 を 間 違 っ て 返 す こ と が あ る 。 返 り 値 が clock_t が 格 納 可 能 な 最 大 値 を 超 過 し た 際 に も 同 じ 問 題 が 起 こ り 得 る 。
関 連 項 目
time(1), getrusage(2), wait(2), clock(3), sysconf(3), time(7)
こ の 文 書 に つ い て
こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。