#include <sys/times.h> clock_t times(struct tms *buf);
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 を返した瞬間に加算されます。つまり、子がまだ終了を待っていない状態では、孫プロセスの時間は決して現れません。
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 では、 times() の返り値を計算する起点となる「過去の任意の時点」は、カーネルのバージョン により異なります。Linux 2.4 以前では、この時点はシステムが起動した瞬間である。 Linux 2.6 以降では、この時点はシステム起動時刻の (2^32/HZ) - 300 秒前です。このようにカーネルバージョン (や UNIX の実装) により異なることと、 返り値が clock_t の範囲をオーバーフローする可能性があるという事実を考慮すると、 移植性が必要なアプリケーションではこの値を使うのは避けるのが賢明です。経過時間を測りたい場合には、代わりに clock_gettime(2) を使用します。
SVr1-3 では long を返し、構造体のメンバに time_t 型を使っていましたが、紀元からの秒数ではなくクロック数を格納していました。V7 では構造体のメンバに long 型を使っていました。まだ time_t 型がなかったからです。
sysconf(_SC_CLK_TCK);
clock(3) も clock_t 型の値を返しますが、この値は times() で使用されるクロック tick 数ではなく、 CLOCKS_PER_SEC が単位である点に注意してください。