#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