时间结构返回的时间在Ubuntu中是错误的

时间:2012-11-18 16:41:32

标签: c select timeval

我试图看到select函数对moniter文件所花费的时间,但是当我尝试打印它时,我得到一个很长的数字。这是代码:

struct timeval to;
to.tv_usec=25;
nfds=select(maxfds+1,&readset,NULL,NULL,&to);
printf("Time left for monitering the file descriptors %d\n",to);

这种奇怪行为的原因是什么?这段代码适用于to.tv_sec

enter image description here

此致

2 个答案:

答案 0 :(得分:1)

你不能以这种方式将结构传递给printf()。传递其中一个成员或从中创建的值。

如果您将timeval结构的定义跟踪到特定于实现的详细信息,您可能会发现类似这样的内容:

struct timeval
  {
    __time_t tv_sec;    /* Seconds.  */
    __suseconds_t tv_usec;  /* Microseconds.  */
  };

这说明内存中有一个构造(至少在这个特定的平台上)由一个以秒为单位的值组成,后面跟着一个微秒值。这两个值构成了结构的成员。

需要为select()等函数指定结构本身。指向第一个成员的指针通常可能具有与其值相同的原始内存地址,但不能正式或可移植地互换,如果被误用作结构指针,则会导致警告。

像printf()这样的通用普通值函数不知道timeval结构,因此必须给出可以解释为它理解的数值类型的struct成员,或者通过组合struct成员创建的值。例如,使用两个字段计算64位时间(以毫秒为单位)并使用64位printf格式说明符显示它是很常见的。

答案 1 :(得分:0)

我相信你的另一个问题是你没有初始化结构的值。你声明它,它在堆栈上创建它,并留下任何垃圾数据。然后你只设置tv_usec成员。

最好像这样声明和初始化它:struct timeval to = {0, 25};这样可以保证所有结构字段都被设置。