select 函式及其應用

2021-09-05 10:29:22 字數 1857 閱讀 1484

select()函式用於在非阻塞中,當乙個套接字或一組套接字有訊號時通知你,系統提供select函式來實現多路復用輸入/輸出模型, 所在的標頭檔案為#include#include原型:

int select(int maxfd,fd_set *rdset,fd_set *wrset,fd_set *exset,struct timeval *timeout);

引數:maxfd: 需要監視的最大的檔案描述符的值+1 ;

rdset: 需要檢測的可讀檔案描述符的集合;

wrset: 需要檢測的可寫檔案描述符的集合;

exset: 需要檢測的異常檔案描述符的集合,不包括錯誤;

struct timeval: 用於描述一段時間長度,如果在這個時間內,需要監視的描述符沒有事件發生則函式返回,返回值為0;

檔案描述集合的型別為fd_set,這是一組檔案描述符(fd)的集合。(檔案描述符概念參考此文章) 對於fd_set型別通過下面四個巨集來操作:

fd_zero(fd_set *fdset) //將指定的檔案描述符集清空,在對檔案描述符集合進行設定前,必須對其進行初始化,如果不清空,由於在系統分配記憶體空間後,通常並不作清空處理,所以結果是不可知的。

fd_set(fd_set *fdset) //用於在檔案描述符集合中增加乙個新的檔案描述符。

fd_clr(fd_set *fdset) //用於在檔案描述符集合中刪除乙個檔案描述符。

fd_isset(int fd,fd_set *fdset) //用於測試指定的檔案描述符是否在該集合中。

unix系統通常會在標頭檔案中定義常量fd_setsize,它是資料型別fd_set中檔案描述符的數量,其值通常是1024,這樣就能表示小於1024的檔案描述符。

struct timeval結構體在time.h中的定義為:

struct timeval

;

其中,tv_sec為epoch到建立struct timeval時的秒數,tv_usec為微秒數,即秒後面的零頭。因此 timeout 用於描述一段時間長度,如果在這個時間內,需要監視的描述符沒有事件發生則函式返回,返回值為0。對於select函式的功能簡單的說就是對檔案fd做乙個測試。測試結果有三種可能:

timeout=null(阻塞:select將一直被阻塞,直到某個檔案描述符上發生了事件)

timeout所指向的結構,時間設為0(非阻塞:僅檢測描述符集合的狀態,然後立即返回,並不等待外部事件的發生)

經過上面引數的分析可以知道,select()函式的功能:測試指定的檔案描述符集合中是否有可讀、可寫或異常條件待處理? select()將更新fd_set 集合, 把其中不可讀的套節字去掉,只保留符合條件的套節字在這個集合裡面。使用select函式的過程一般是:先呼叫巨集fd_zero將指定的fd_set清零,然後呼叫巨集fd_set將需要測試的fd加入fd_set,接著呼叫函式select測試fd_set中的所有fd,最後用巨集fd_isset檢查某個fd在函式select呼叫後,相應位是否仍然為1。

舉個例子,比如recv(), 在沒有資料到來呼叫它的時候,你的執行緒將被阻塞,如果資料一直不來,你的執行緒就要阻塞很久。所以採用select來檢視套節字是否有資料讀了。步驟如下:

#include #include socket   s;     //乙個讀資料的套節字s

fd_set set; //集合

struct timespec time= ; //等待時間為1s

while(1)

//do something here

}

select()函式的應用

select用法 include include include include int select int n,fd set readfds,fd set writefds,fd set exceptfds,struct timeval timeout int pselect int n,fd ...

select函式詳解及應用

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

select函式詳解及應用

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