我在我的 prog 中使用了 select 调用,它适用于大多数 unix 风格。但是,它适用于一个 HPUX ia64 机器,但另一个它立即超时。
经过几次重新构建,我了解到我设置了 tv_sec 但没有设置 timeval 结构的 tv_usec。将 timeval 结构的 tv_usec 成员设置为 0 后,它开始在所有平台上工作。
但是,我不明白为什么程序在同一个操作系统上表现不同的原因?以及如何仅通过设置解决问题tm.tv_usec = 0
?
tv_sec
并且tv_usec
是有符号int
值,因此它们可以是负数。
如果您的结构是局部变量,它将包含堆栈上发生的任何内容。
在select
中,时间的秒部分是这样计算的(取自Linux 源代码):
tv.tv_sec + (tv.tv_usec / USEC_PER_SEC)
如您所见,没有检查数字是否为正,因此如果未初始化的变量碰巧包含一个大的负数,select
则会立即返回。
编辑:
使用未初始化的变量会导致未定义的行为。因此,select
在一台机器上而不是在另一台机器上立即返回是在 C 规范内。