0

我在我的 prog 中使用了 select 调用,它适用于大多数 unix 风格。但是,它适用于一个 HPUX ia64 机器,但另一个它立即超时。

经过几次重新构建,我了解到我设置了 tv_sec 但没有设置 timeval 结构的 tv_usec。将 timeval 结构的 tv_usec 成员设置为 0 后,它开始在所有平台上工作。

但是,我不明白为什么程序在同一个操作系统上表现不同的原因?以及如何仅通过设置解决问题tm.tv_usec = 0

4

1 回答 1

2

tv_sec并且tv_usec是有符号int值,因此它们可以是负数。

如果您的结构是局部变量,它将包含堆栈上发生的任何内容。

select中,时间的秒部分是这样计算的(取自Linux 源代码):

  tv.tv_sec + (tv.tv_usec / USEC_PER_SEC)

如您所见,没有检查数字是否为正,因此如果未初始化的变量碰巧包含一个大的负数,select则会立即返回。

编辑:

使用未初始化的变量会导致未定义的行为。因此,select在一台机器上而不是在另一台机器上立即返回是在 C 规范内。

于 2011-11-23T14:09:44.540 回答