select函式用法

2021-06-21 16:21:06 字數 2897 閱讀 9203

原型

int select(

intnfds

,

fd_set*readfds

,

fd_set*writefds

,

fd_set*exceptfds

,

const struct timeval*timeout

);

nfds:本引數忽略,僅起到相容作用。

readfds:(可選)指標,指向一組等待可讀性檢查的套介面。

writefds:(可選)指標,指向一組等待可寫性檢查的套介面。

exceptfds:(可選)指標,指向一組等待錯誤檢查的套介面。

timeout:select()最多等待時間,對阻塞操作則為null。

範例 :

sock= socket(af_inet,sock_stream,0);

struct sockaddr_in addr;     //告訴sock 應該再什麼地方licence

memset(&addr,0,sizeof(addr));

addr.sin_family=af_inet;

addr.sin_port=htons(11111);  

//埠啦

addr.sin_addr.s_addr=htonl(inaddr_any);        //在本機的所有ip上開始監聽

bind (sock,(sockaddr *)&addr,sizeof(addr));//bind....

listen(sock,5);                   //最大5個佇列

socket socka;                    //這個用來接受乙個連線

fd_set rfd;                     // 描述符集 這個將用來測試有沒有乙個可用的連線

struct timeval timeout;

fd_zero(&rfd);                     //總是這樣先清空乙個描述符集

timeout.tv_sec=60;                //等下select用到這個

timeout.tv_usec=0;

u_long ul=1;

ioctlsocket(sock,fionbio,&ul);    //用非阻塞的連線

//現在開始用select

fd_set(sock,&rfd);   //把sock放入要測試的描述符集 就是說把sock放入了rfd裡面 這樣下一步呼叫select對rfd進行測試的時候就會測試sock了(因為我們將sock放入的rdf) 乙個描述符集可以包含多個被測試的描述符, 

if(select(sock+1,&rfd,0,0, &timeout)==0) 

if(fd_isset(sock,&rfd))

if(fd_isset(sockb,&rfd)   //sockb可讀

if(fd_isset(socka,&wfd) //socka 可寫

if(fd_isset(sockb,&wfd) //sockb可寫

}二、linux c中

select(i/o多工機制)

表頭檔案

#i nclude

#i nclude

#i nclude

定義函式

int select(int n,fd_set * readfds,fd_set * writefds,fd_set * exceptfds,struct timeval * timeout);

函式說明

select()用來等待檔案描述詞狀態的改變。引數n代表最大的檔案描述詞加1,引數readfds、writefds 和exceptfds 稱為描述片語,是用來回傳該描述詞的讀,寫或例外的狀況。底下的巨集提供了處理這三種描述片語的方式:

fd_clr(inr fd,fd_set* set);用來清除描述片語set中相關fd 的位

fd_isset(int fd,fd_set *set);用來測試描述片語set中相關fd 的位是否為真

fd_set(int fd,fd_set*set);用來設定描述片語set中相關fd的位

fd_zero(fd_set *set); 用來清除描述片語set的全部位

引數timeout為結構timeval,用來設定select()的等待時間,其結構定義如下

struct timeval

;返回值

如果引數timeout設為null則表示select()沒有timeout。

錯誤**

執行成功則返回檔案描述詞狀態已改變的個數,如果返回0代表在描述詞狀態改變前已超過timeout時間,當有錯誤發生時則返回-1,錯誤原因存於errno,此時引數readfds,writefds,exceptfds和timeout的值變成不可**。

ebadf 檔案描述詞為無效的或該檔案已關閉

eintr 此呼叫被訊號所中斷

einval 引數n 為負值。

enomem 核心記憶體不足

範例常見的程式片段:fs_set readset;

fd_zero(&readset);

fd_set(fd,&readset);

select(fd+1,&readset,null,null,null);

if(fd_isset(fd,readset)

下面是linux環境下select的乙個簡單用法

#i nclude

#i nclude

#i nclude

#i nclude

#i nclude

#i nclude

int main ()}}

Select函式用法

select函式用於在非阻塞中,當乙個套接字或一組套接字有訊號時通知你,系統提供select函式來實現多路復用輸入 輸出模型,原型 include include int select int maxfd,fd set rdset,fd set wrset,fd set exset,struct t...

select函式的用法

select函式用於在非阻塞中,當乙個套接字或一組套接字有訊號時通知你,系統提供select函式來實現多路復用輸入 輸出模型,原型 int select int maxfd,fd set rdset,fd set wrset,fd set exset,struct timeval timeout 所...

fd set 用法 select函式相關

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