选择呼叫在HPUX ia64上获得超时

时间:2011-11-23 12:21:00

标签: c sockets hp-ux

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

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

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

1 个答案:

答案 0 :(得分:2)

tv_sectv_usec是已签名的int值,因此可以为负数。

如果你的struct是一个局部变量,它将包含发生的任何事情 在堆栈上。

select中,时间的秒数部分计算如下(取自the Linux source code):

  tv.tv_sec + (tv.tv_usec / USEC_PER_SEC)

正如您所看到的,没有检查数字是否为正数,因此如果未初始化的变量恰好包含较大的负数,select将立即返回。

修改

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