我已經在我的編程中使用了select調用,並且它可以在大多數unix版本上運行。但是,它可以在一個HPUX ia64盒子上運行,但另一個會立即超時。選擇呼叫在HPUX上獲取超時ia64
經過幾次重新編譯,我明白我已經設置了tv_sec,但沒有設置timeval結構的tv_usec。將timeval結構的tv_usec成員設置爲0後,它開始在所有平臺上工作。
但是,我不明白爲什麼程序爲相同的操作系統行爲不同的原因?以及如何通過設置tm.tv_usec = 0
解決問題?
我已經在我的編程中使用了select調用,並且它可以在大多數unix版本上運行。但是,它可以在一個HPUX ia64盒子上運行,但另一個會立即超時。選擇呼叫在HPUX上獲取超時ia64
經過幾次重新編譯,我明白我已經設置了tv_sec,但沒有設置timeval結構的tv_usec。將timeval結構的tv_usec成員設置爲0後,它開始在所有平臺上工作。
但是,我不明白爲什麼程序爲相同的操作系統行爲不同的原因?以及如何通過設置tm.tv_usec = 0
解決問題?
tv_sec
和tv_usec
被標記爲int
值,因此它們可以是負數。
如果你的結構體是一個局部變量,它將包含任何發生在 上的東西。
在select
,時間的秒數部分計算如下(從the Linux source code拍攝):
tv.tv_sec + (tv.tv_usec/USEC_PER_SEC)
正如你所看到的,沒有檢查,這些數字是正的,所以如果在未初始化的變量應恰巧包含一個很大的負數,select
將立即返回。
編輯:
使用未定義行爲的未初始化變量的結果。因此,select
在一臺機器上立即返回而不在另一臺機器上,因此在C規範中。
如果'struct timeval'結構被分配到堆棧上或動態分配,並且沒有明確初始化爲'0','tv.tv_usec'中會有隨機垃圾。 –