2010-12-10 88 views
0

在我的插座編程任務,我做了這樣的選擇調用:在c中選擇呼叫後超時是否發生變化?

select(s+1, &rfds, (fd_set *)0, (fd_set *)0,&tv) 

其中TV的類型是struct timeval

我讀手冊頁選擇,它說:

在Linux上,函數select會修改超時以反映未睡眠的時間量;大多數其他實現不這樣做。這會導致問題既當Linux的代碼,其讀取超時被移植到其他操作系統,並且當代碼被移植到Linux一個可重用在一個循環中多個選擇一個timeval結構而不重新初始化它。考慮在選擇返回後超時未定義。

這是否意味着我的電視變量會在電話選擇後改變? (我使用Ubuntu)

+0

您不應該將零'C中'fd_set *'事件更好,只需傳遞'NULL'。 – 2010-12-10 13:29:45

+0

有些人只是總是堅持無用的演員.... – 2010-12-10 14:37:04

回答

6

是的,它的作用。爲便於攜帶,您應在每次致電select前重新初始化它。

5

變量仍指向同一個結構,但該結構的內容將被改變。

3

還要注意的是在錯誤的timeval結構的內容是不確定的,當選擇()返回。因爲你不能保證不得到一個錯誤(EINTR是最常見的),你需要一個機制來跟蹤剩餘的(如果你願意),無論如何,所以使用恢復後的timeval結構的內容,時間是在浪費大多數情況下甚至沒有可移植性問題

+0

保證'EINTR'不會發生是微不足道的。你只是不設置任何信號處理程序。只有*處理*信號可以中斷系統調用。 – 2010-12-10 14:37:51

1

非常重要的注意事項:選擇()將並不總是減少超時值。

在一般只要選擇()不會立即返回,這將降低超時值。

當選擇()被調用時,如果有已經等待,儘管選擇呼叫服用的時間來執行一點點數據,超時不降低

因此,在繁忙的系統中,使用它作爲時間測量是危險的。我們添加了一種解決方法,可以檢測何時運行select並且超時值沒有降低,並且會在這種情況下手動略微減少,以便超時仍會定期地達到0.