fd set 用法 select函式相關

2021-05-22 17:51:01 字數 1833 閱讀 2525

select()函式主要是建立在fd_set型別的基礎上的。fd_set(它比較重要所以先介紹一下)是一組檔案描述字(fd)的集合,它用一位來表示乙個fd(下面會仔細介紹),對於fd_set型別通過下面四個巨集來操作: 

fd_set set;

fd_zero(&set);      

fd_set(fd, &set);   

fd_clr(fd, &set);   

fd_isset(fd, &set);        

過去,乙個fd_set通常只能包含<32的fd(檔案描述字),因為fd_set其實只用了乙個32位向量來表示fd;現在,unix系統通常會在標頭檔案中定義常量fd_setsize,它是資料型別fd_set的描述字數量,其值通常是1024,這樣就能表示<1024的fd。根據fd_set的位向量實現,我們可以重新理解操作fd_set的四個巨集: 

fd_set set;

fd_zero(&set);     

fd_set(0, &set);   

fd_clr(4, &set);     

fd_isset(5, &set);

―――――――――――――――――――――――――――――――――――――――

注意fd的最大值必須――――――――――――――――――――――――――――――――――――――― 

select函式的介面比較簡單:

int select(int nfds, fd_set *readset, fd_set *writeset,fd_set* exceptset, struct tim *timeout); 

功能:測試指定的fd可讀?可寫?有異常條件待處理?     

引數:nfds    

需要檢查的檔案描述字個數(即檢查到fd_set的第幾位),數值應該比三組fd_set中所含的最大fd值更大,一般設為三組fd_set中所含的最大fd值加1(如在readset,writeset,exceptset中所含最大的fd為5,則nfds=6,因為fd是從0開始的)。設這個值是為提高效率,使函式不必檢查fd_set的所有1024位。

readset   

用來檢查可讀性的一組檔案描述字。

writeset

用來檢查可寫性的一組檔案描述字。

exceptset

用來檢查是否有異常條件出現的檔案描述字。(注:錯誤不包括在異常條件之內)

timeout

有三種可能:

1.    timeout=null(阻塞:直到有乙個fd位被置為1函式才返回)

3.    timeout所指向的結構,時間設為0(非阻塞:函式檢查完每個fd後立即返回) 

返回值:     

返回對應位仍然為1的fd的總數。 

remarks:

三組fd_set均將某些fd位置0,只有那些可讀,可寫以及有異常條件待處理的fd位仍然為1。

使用select函式的過程一般是:

先呼叫巨集fd_zero將指定的fd_set清零,然後呼叫巨集fd_set將需要測試的fd加入fd_set,接著呼叫函式select測試fd_set中的所有fd,最後用巨集fd_isset檢查某個fd在函式select呼叫後,相應位是否仍然為1。 

以下是乙個測試單個檔案描述字可讀性的例子:

int isready(int fd)

下面還有乙個複雜一些的應用:

//這段**將指定測試socket的描述字的可讀可寫性,因為socket使用的也是fd

select函式及fd set介紹

在程式設計的過程中,經常會遇到許多阻塞的函式,好像read和網路程式設計時使用的recv,recvfrom函式都是阻塞的函式,當函式不能成功執行的時候,程式就會一直阻塞在這裡,無法執行下面的 這是就需要用到非阻塞的程式設計方式,使用select函式就可以實現非阻塞程式設計。select函式是乙個輪循...

Linux下select 機制中fd set用法

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

select函式用法

原型 int select intnfds fd set readfds fd set writefds fd set exceptfds const struct timeval timeout nfds 本引數忽略,僅起到相容作用。readfds 可選 指標,指向一組等待可讀性檢查的套介面。wr...