2014-11-15 40 views
0

select()錯誤時返回-1,超時時返回0,成功時返回集合中描述符的數量。在接收消息時用select()繼續計數超時值?

假設我們有以下僞代碼:

while(1){ 
    int s = select(..., &timeout); //timeout = 5 sec 

    if (s < 0) { perror(...); } 

    else if(s == 0) { //timeout } 

    else { 
     //wait for some recv event or STDIN 
    } 
} 

我認爲,整個過程既等待,直到超時,或者直到一些recv的事件發生。

我只需要使用select()從任意數量的對等體接收指定時間的時候,我需要保持它的計數。

我該如何做到這一點?

+0

這是有點不清楚你在問什麼......「需要讓它繼續計數」,但我沒有看到*任何*計數。 – WeaponsGrade

回答

2

在Linux上,select系統調用會將超時值減去所用的時間量。 Posix允許但不要求這種行爲,這使得很難依靠;便攜式代碼應該假定當select調用返回時timeout的內容未指定。

唯一真正的便攜式解決方案是先計算您希望超時過期的絕對時間,然後檢查每次後續調用選擇之前的時間以計算正確的超時值。小心可能倒退的時鐘(或向前跳過); CLOCK_MONOTONIC通常是你最好的選擇。

+1

@ user2418202:這就是爲什麼我提到了linux特有的行爲。在linux上,只要不重置超時時間,它就會自動倒數爲0.如果Posix需要這種行爲或者定義了一個具有該行爲的備用接口,但它沒有這樣做,那將會很不錯。在孩子中使用管道,子過程和第二次選擇呼叫有一個竅門,但由於難以在沒有時鐘的情況下同步孩子,所以它不精確。 – rici

+0

我很抱歉。我必須更仔細地閱讀你的答案。這是完美的。 – user2418202

相關問題