#include
<
sys
/
times.h
>
clock_t times(
struct
tms
*
buf);
返回值: 若成功则返回流逝的墙上时钟时间, 若出错返回-1. 所有由此函数返回的clock_t值都用_SC_CLK_TCK变换成秒数.(由sysconf函数返回的每秒时钟滴答数) 此函数填写由buf指向的tms结构, 该结构定义如下:
struct
tms
...
{ clock_t tms_utime; /**/ /* user CPU time */ clock_t tms_stime; /**/ /* system CPU time */ clock_t tms_cutime; /**/ /* user CPU time, terminated children */ clock_t tms_cstime; /**/ /* system CPU time, terminated children */ }
;
注意: 此结构没有包含墙上时钟是的任何测量值. 作为替代, times函数返回墙上时钟时间作为函数值. 此值是相对于过去的某一时刻测试的, 所以不能用其绝对值, 而必须使用其相对值. 例如, 调用times, 保存其返回值. 在以后某个时间再次调用times, 从新的返回值中减去以前的返回值, 此差值就是墙上时钟时间. 该结构中的后两个成员是针对子进程的变量, 包含了用wait, waitpid等待到的各个子进程的值.
实例代码:
#include
<
sys
/
times.h
>
static
void
pr_times(clock_t, struct tms
*
, struct tms
*
);
static
int
do_cmd(
char
*
);
int
main()
...
{ int i; setbuf(stdout, NULL); for (i = 1 ; i < argc; i ++ ) do_cmd(argv[i]); return 0 ; }
static
int
do_cmd(
char
*
cmd)
...
{ struct tms tmsstart, tmsend; clock_t start, end; int status; printf( " command: %s " , cmd); if ((start = times( & tmsstart)) == - 1 ) /**/ /* error handler */ if ((status == system(cmd)) < 0 ) /**/ /* error handler */ if (end = times( & tmsend)) == - 1_ /**/ /* error handler */ pr_times(end- start, & tmsstart, & tmsend); return status; }
static
void
pr_times(clock_t real, struct tms
*
tmsstart, struct tms
*
tmsend)
...
{ static long clktck = 0 ; if (clktck == 0 ) if ((clktck = sysconf(_SC_CLK_TCK)) < 0 ) /**/ /* error hanlder */ printf(" read: %7.2f " , read / ( double )clktck); printf( " user: %7.2f " , tmsend -> tms_utime - tmsstart -> tms_utime) / ( double ) clktck); ... ... }
运行:
$ ./a.out "sleep 5" "date"
command: sleep 5 real: 5.02 user: 0.00 sys: 0.00 child user: 0.01 child sys: 0.00
command: date Fri Jun 22 17:11:20 EST 2007 real: 0.01 user: 0.00 sys: 0.00 child user: 0.01 child sys: 0.00