EN JA
TIMES(2)
TIMES(2) Linux Programmer's Manual TIMES(2)

名前

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_utimetms_cutime の合計である。 tms_cstime フィールドは、終了を待っている全ての子プロセスの tms_stimetms_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 より前のバージョンでは、 SIGCHLDSIG_IGN に設定すると終了した子プロセスの回数は自動的に tms_cstimetms_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.51 の一部である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。
2012-10-22 Linux