0

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

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.

在此处输入图像描述

问候

4

2 回答 2

1

您不能以这种方式将结构传递给 printf() 。传递其成员之一或从它们创建的值。

如果您将 timeval 结构的定义追溯到特定于实现的细节,您可能会发现如下内容:

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

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

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

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

于 2012-11-18T16:47:25.497 回答
0

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

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

于 2012-11-18T21:26:16.640 回答