0

我开始学习 Linux C,但遇到的问题让我很困惑。
我使用函数。times但返回值等于 0。
好吧,我犯了错误,我更改了代码:但是与 printf 没有太大关系。clock_t 在 Linux 中用 long 定义。所以我将 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进行调试,begintimes的变量也为零。printf与功能没有关系。请

4

2 回答 2

3

这并不罕见;该过程根本没有使用足够的 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;
}
于 2013-08-29T05:51:13.127 回答
2

您的代码使用几乎没有 CPU 时间,因此结果是正确的。睡眠暂停你的程序执行——在这段时间内发生的一切都不是你的执行时间,所以它不会被计算在内。

添加空循环,您将看到不同之处。(ofc.,禁用编译器优化 - 否则将删除空循环)。

看一下“时间”程序输出(时间 ./a.out) - 它打印“实时”时间(我想由 gettimeofday() 估计)、用户时间(用户空间代码浪费的时间)和系统时间(时间浪费在系统调用中——例如写入文件、打开网络连接等)。

(当然,“浪费”是指“使用”,但无论如何)

于 2013-08-29T05:48:22.680 回答