2011-11-23 53 views
0

我已經在我的編程中使用了select調用,並且它可以在大多數unix版本上運行。但是,它可以在一個HPUX ia64盒子上運行,但另一個會立即超時。選擇呼叫在HPUX上獲取超時ia64

經過幾次重新編譯,我明白我已經設置了tv_sec,但沒有設置timeval結構的tv_usec。將timeval結構的tv_usec成員設置爲0後,它開始在所有平臺上工作。

但是,我不明白爲什麼程序爲相同的操作系統行爲不同的原因?以及如何通過設置tm.tv_usec = 0解決問題?

+0

如果'struct timeval'結構被分配到堆棧上或動態分配,並且沒有明確初始化爲'0','tv.tv_usec'中會有隨機垃圾。 –

回答

2

tv_sectv_usec被標記爲int值,因此它們可以是負數。

如果你的結構體是一個局部變量,它將包含任何發生在 上的東西。

select,時間的秒數部分計算如下(從the Linux source code拍攝):

tv.tv_sec + (tv.tv_usec/USEC_PER_SEC) 

正如你所看到的,沒有檢查,這些數字是正的,所以如果在未初始化的變量應恰巧包含一個很大的負數,select將立即返回。

編輯:

使用未定義行爲的未初始化變量的結果。因此,select在一臺機器上立即返回而不在另一臺機器上,因此在C規範中。

+0

tv_sec是time_t - 一個無符號值,假定符合POSIX。 –

+0

@ Klas-我有調試二進制和tv_usec從來沒有一個負數。如果是非負數,則根據加法邏輯,選擇不應該在指定時間之前退出。 – Sach

+0

@Klas:還想補充一點,它可以在linux上工作,而不需要將tv_usec設置爲0.它也適用於HP-UX,但需要刪除與hpux相關的編譯選項。 – Sach