我开始了解Linux C,但是我遇到了这个让我很困惑的问题
我使用函数times
。但返回值等于0
好吧,我犯了错误,我改变了代码:
但与printf没有多大关系。 clock_t在Linux中定义为long.so我将clock_t转换为long
这是我的代码:
#include <sys/times.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
long clock_times;
struct tms begintime;
sleep(5);
if((clock_times=times(&begintime))==-1)
perror("get times error");
else
{
printf("%ld\n",(long)begintime.tms_utime);
printf("%ld\n",(long)begintime.tms_stime);
printf("%ld\n",(long)begintime.tms_cutime);
printf("%ld\n",(long)begintime.tms_cstime);
}
return 0;
}
输出:
0
0
0
0
也返回0;
我使用gdb进行调试,开始时间的变量也是零。
没有printf
函数的亲戚。
请
答案 0 :(得分:2)
您的代码使用接近无CPU的时间,因此结果是正确的。睡眠暂停程序执行 - 此时发生的所有事情都不是您的执行时间,因此不会计算在内。
添加空循环,您将看到差异。 (当然,禁用编译器优化 - 或者将删除空循环)。
看看'时间'程序输出(时间./a.out) - 打印'实际'时间(我估计是gettimeofday()估计),用户时间(用户空间代码浪费的时间)和系统时间(在系统调用中浪费的时间 - 例如写入文件,打开网络连接等)。
(当然,'浪费'我的意思是'用',但无论如何)
答案 1 :(得分:2)
这并不罕见;该过程根本没有使用足够的CPU时间来测量。进程在sleep()
中花费的时间不计入程序的CPU时间,因为times()
度量执行用户指令所需的CPU时间(以及其他相关时间)这是进程执行用户/内核代码所花费的时间。
将程序更改为以下使用更多CPU的程序,因此可以进行测量:
#include <sys/times.h>
#include <sys/time.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
long clock_times;
struct tms begintime;
unsigned i;
for (i = 0; i < 1000000; i++)
time(NULL); // An arbitrary library call
if((clock_times=times(&begintime))==-1)
perror("get times error");
else
{
printf("%ld %ld %ld %ld\n",
(long)begintime.tms_utime,
(long)begintime.tms_stime,
(long)begintime.tms_cutime,
(long)begintime.tms_cstime);
}
return 0;
}