select 函式 timval問題

2022-06-02 15:18:19 字數 695 閱讀 5827

如果select呼叫中設定了等待時間,那麼每次呼叫時都需要重新對這個時間賦值。例如: 

struct timval tv; 

while(1) {

........;

tv.tv_sec = 2; 

tv.tv_usec = 0; 

select(maxfd+1, &readfd, null, null, &tv); 

傳的是乙個引用進去,select裡面可能會改變這個位址裡儲存的內容。所以每次迴圈都必須重新賦值

------------------------------

將時間的初始化放在外邊,時間初始化為2秒,假設在1秒後發上了事件,則select將會返回並將tv的時間變成上次阻塞的剩餘時間,即1秒,然後再進行監視套接字。這是因為linux系統對select()的實現中會修改引數tv為剩餘時間。所以在迴圈內部使用函式select的時候一定要在迴圈內部初始化時間引數。

在網路程式中,乙個程序同時處理多個檔案描述符是很常見的情況。select()系統呼叫可以使程序檢測同時等待的多個i/o裝置,

當沒有裝置準備好時,select()阻塞,其中任一裝置準備好時,select()就返回。

這個函式真是神通廣大,用來定時也不錯。select(0, null, null, null, &tv); tv在每次執行select前都要重新設定一遍,不然就變成0了。感覺它的精度比usleep()要高一些。

select函式詳解

select的機制中提供了乙個fd set的資料結構,實際上是long型別的陣列,每乙個陣列元素都能與一開啟的檔案控制代碼 不管是socket控制代碼,還是其他檔案或命名管道或裝置控制代碼 建立聯絡,建立聯絡的工作由程式設計師完成,當呼叫select 時,由核心根據io狀態修改fd set的內容,由...

select函式作用

select在socket程式設計中還是比較重要的,可是對於初學socket的人來說都不太愛用select寫程式,他們只是習慣寫諸如connect accept recv或recvfrom這樣的阻塞程式 所謂阻塞方式block,顧名思義,就是程序或是執行緒執行到這些函式時必須等待某個事件的發生,如果...

select 函式詳解

select函式 系統提供select函式來實現多路復用輸入 輸出模型。原型 include include select函式 系統提供select函式來實現多路復用輸入 輸出模型。原型 include include int select int maxfd,fd set rdset,fd set...