【问题标题】:Time returned by timeval structure is wrong in Ubuntutimeval 结构返回的时间在 Ubuntu 中是错误的
【发布时间】:2012-11-06 16:27:15
【问题描述】:

我正在尝试查看 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 配合使用的代码。

问候

【问题讨论】:

  • 你能显示一个示例输出吗?
  • 请注意,通过 select() 改变 tv 的值是 Linux 主义。另外:您可以 printf both 的成员 to : ` " ... ors {%d,%d}\n", (int) to.tv_sec, (int) to.tv_usec);`

标签: c select timeval


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • 好的,即使我在 select 函数中仅传递 timeval 结构的一个成员,例如 to.tv_sec,select 同时使用 tv_sec 和 tv_usec。为什么会这样
  • 将指向 timeval 结构的指针传递给 select(),因为这是它所需要的,但将成员变量或从它们计算的东西传递给 printf(),因为它不理解 timeval 结构。在 tv_sec 是 timeval 结构的第一个成员的平台上,指向该成员的指针可能与指向结构本身的指针具有相同的原始值(内存地址),因此如果您设法忽略不正确的演员。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2011-08-09
    • 2014-02-26
    • 1970-01-01
    • 2015-11-30
    • 2016-01-24
    • 2011-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多