我在我的编程中使用了select调用,它适用于大多数unix风格。但是,它适用于一个HPUX ia64盒子,但另一个立即超时。
经过多次重建后,我明白我已经设置了tv_sec但没有设置timeval结构的tv_usec。将timeval结构的tv_usec成员设置为0后,它开始在所有平台上工作。
但是,我不明白为什么程序在同一个操作系统中表现不同的原因?以及如何通过设置tm.tv_usec = 0
来解决问题?
答案 0 :(得分:2)
tv_sec
和tv_usec
是已签名的int
值,因此可以为负数。
如果你的struct是一个局部变量,它将包含发生的任何事情 在堆栈上。
在select
中,时间的秒数部分计算如下(取自the Linux source code):
tv.tv_sec + (tv.tv_usec / USEC_PER_SEC)
正如您所看到的,没有检查数字是否为正数,因此如果未初始化的变量恰好包含较大的负数,select
将立即返回。
修改强>
使用未初始化的变量会导致未定义的行为。因此select
立即在一台机器上返回而不在另一台机器上返回,因此在C规范中。