函数原型:
#include <sys/times.h>
clock_t times (struct tms * buf );
函数功能:
获取进程时间。
说明:
times() 函数返回从过去一个任意的时间点所经过的时钟数。返回值可能会超出 clock_t
(一般为 long 型) 的范围(溢出)。如果发生错误,则返回 (clock_t ) -1 类型,然后设置相应的 errno
值。
系统每秒的时钟可以通过 sysconf(_SC_CLK_TCK); 函数获得。关于 sysconf()
函数的详细信息见:http://blog.sina.com.cn/s/blog_590be5290100ncty.html
上面 _SC_CLK_TCK 的值为 2,因为它在 /usr/include/bits/confname.h
头文件的一个枚举类型里定义。
struct tms 结构体定义在 <sys/times.h>
头文件里,具体定义如下:
struct tms
{
clock_t
tms_utime
;
clock_t
tms_stime
;
clock_t
tms_cutime
;
clock_t
tms_cstime
;
};
实例验证 times() 函数
测试代码:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/times.h>
int main ()
{
struct tms
time_buf_head , time_buf_end ;
long tck = 0 ;
clock_t
time_head , time_end ;
tck =
sysconf (_SC_CLK_TCK
);
time_head
= times ( & time_buf_head
);
printf
("head_time is : %f \n " , time_head / (double )tck
);
//system
("./time_test.exe");
system
("sleep 2"
);
time_end =
times ( & time_buf_end
);
printf
("end_time is : %f \n " , time_end / (double )tck );
printf
("user time is : %f \n " , ((time_buf_end . tms_utime -
time_buf_head . tms_utime ) / double )tck
));
printf
("systime time is : %f \n " , ((time_buf_end . tms_stime -
time_buf_head . tms_stime ) / double )tck ));
printf
("child user time is : %f \n " , ((time_buf_end . tms_cutime -
time_buf_head . tms_cutime ) / (double )tck ));
printf
("child sys time is : %f \n " , ((time_buf_end . tms_cstime -
time_buf_head . tms_cstime ) / (double )tck ));
return (0
);
}
运行输出:
beyes@beyes-groad:~$
./time.exe
head_time is : 17236892.770000
end_time is : 17236894.790000
user time is : 0.000000
systime time is : 0.000000
child user time is : 0.000000
child sys time is : 0.000000
从上面看到,时间间隔刚好是 2s,下面的时间值都是 0。
为了验证问题,现在修改一下源程序:
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/times.h>
int main ()
{
struct tms time_buf_head , time_buf_end ;
long tck = 0 ;
clock_t time_head , time_end ;
int i ;
int j ;
tck = sysconf (_SC_CLK_TCK );
time_head = times ( & time_buf_head );
printf ("head_time is : %f \n " , time_head / (double )tck );
for (i = 0 ; i < 20000 ; i ++ )
for (j = 0 ; j < 20000 ; j ++ ) {
;
}
time_end = times ( & time_buf_end );
printf ("end_time is : %f \n " , time_end / (double )tck );
printf ("user time is : %f \n " , ((time_buf_end . tms_utime -
time_buf_head . tms_utime ) / double )tck
));
printf ("systime time is : %f \n " , ((time_buf_end . tms_stime -
time_buf_head . tms_stime ) / (double )tck ));
printf ("child user time is : %f \n " , ((time_buf_end . tms_cutime
- time_buf_head . tms_cutime ) / (double )tck ));
printf ("child sys time is : %f \n " , ((time_buf_end . tms_cstime
- time_buf_head . tms_cstime ) / (double )tck ));
return (0 );
}
运行输出:
beyes@beyes-groad:~$
./time.exe
head_time is : 17184643.070000
end_time is : 17184644.280000
user time is : 1.200000
systime time is : 0.000000
child user time is : 0.000000
child sys time is : 0.000000
由于使用了大量的延迟,这时可以看到 user time 里耗费了 1.2s ,而 end_time 和 head_time
的时间间隔为 1.21s 约等于 1.2s 。
再来修改一下代码:
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/times.h>
int main ()
{
struct tms time_buf_head , time_buf_end ;
long tck = 0 ;
clock_t time_head , time_end ;
int i ;
int j ;
tck = sysconf (_SC_CLK_TCK );
time_head = times ( & time_buf_head );
printf ("head_time is : %f \n " , time_head / (double )tck );
for (i = 0 ; i < 1000 ; i ++ )
for (j = 0 ; j < 1000 ; j ++ ) {
open ("Cannon-1.txt" , O_RDONLY );
}
time_end = times ( & time_buf_end );
printf ("end_time is : %f \n " , time_end / (double )tck );
printf ("user time is : %f \n " , ((time_buf_end . tms_utime -
time_buf_head . tms_utime ) / double )tck ));
printf ("systime time is : %f \n " , ((time_buf_end . tms_stime -
time_buf_head . tms_stime ) / (double )tck ));
printf ("child user time is : %f \n " , ((time_buf_end . tms_cutime
- time_buf_head . tms_cutime ) / (double )tck ));
printf ("child sys time is : %f \n " , ((time_buf_end . tms_cstime
- time_buf_head . tms_cstime ) / (double )tck ));
return (0 );
}
运行输出:
beyes@beyes-groad:~$
./time.exe
head_time is : 17189923.210000
end_time is : 17189923.650000
user time is : 0.160000
systime time is : 0.280000
child user time is : 0.000000
child sys time is : 0.000000
在上面的输出中可以看到,systime time 这时不再为 0,这是因为程序中使用了 open() 这个系统调用的结果,它在两个
for 循环里一共被调用了 1000*1000次,总耗时为0.28s ,而执行这两个 for 的时间为 0.16s
,两个时间加起来的时间间隔正好为 end_time - head_time = 0.44s 。
下面测试子进程的时间,也就是 child user time 和 child sys time
两个。这里,需要另外一个程序,它的主要作用就是和上面一样的调用 open() 打开一个在本目录下的一文本文件,代码如下:
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main ()
{
int i ;
int j ;
for (i = 0 ; i < 1000 ; i ++ )
for (j = 0 ; j < 1000 ; j ++ ) {
open ("Cannon-1.txt" , O_RDONLY );
}
return (0 );
}
上面的程序命名为
time_test.exe ,它会在主程序里被 system() 函数调用到,修改主程序如下:
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/times.h>
int main ()
{
struct tms time_buf_head , time_buf_end ;
long tck = 0 ;
clock_t time_head , time_end ;
int i ;
int j ;
tck = sysconf (_SC_CLK_TCK );
time_head = times ( & time_buf_head );
printf ("head_time is : %f \n " , time_head / (double )tck );
system ("./time_test.exe" );
time_end = times ( & time_buf_end );
printf ("end_time is : %f \n " , time_end / (double )tck );
printf ("user time is : %f \n " , ((time_buf_end . tms_utime -
time_buf_head . tms_utime ) / double )tck ));
printf ("systime time is : %f \n " , ((time_buf_end . tms_stime -
time_buf_head . tms_stime ) / (double )tck ));
printf ("child user time is : %f \n " , ((time_buf_end . tms_cutime
- time_buf_head . tms_cutime ) / (double )tck ));
printf ("child sys time is : %f \n " , ((time_buf_end . tms_cstime
- time_buf_head . tms_cstime ) / (double )tck ));
return (0 );
}
运行输出:
beyes@beyes-groad:~$
./time.exe
head_time is : 17190766.590000
end_time is : 17190767.060000
user time is : 0.000000
systime time is : 0.000000
child user time is : 0.140000
child sys time is : 0.300000
由上可见,child user time 和 child sys time 两者的时间也是为
0.44s,这和上面是一样的,这是因为程序的内容相同。
加载中,请稍候......