select函式總結

2021-08-26 19:23:35 字數 2700 閱讀 7959

阻塞方式block,就是程序或是執行緒執行到這些函式時必須等待某個事件的發生,如果事件沒有發生,程序或執行緒就被阻塞,函式不能立即返回。使用select就可以完成非阻塞non-block,就是程序或執行緒執行此函式時不必非要等待事件的發生,一旦執行肯定返回,以返回值的不同來反映函式的執**況,如果事件發生則與阻塞方式相同,若事件沒有發生則返回乙個**來告知事件未發生,而程序或執行緒繼續執行,所以效率較高。select能夠監視我們需要監視的檔案描述符的變化情況。

(一)首先說明兩個結構體:

1:struct fd_set乙個存放檔案描述符(file descriptor),即檔案控制代碼的聚合,實際上是一long型別的陣列,

每乙個陣列元素都能與一開啟的檔案控制代碼(不管是socket控制代碼,還是其他檔案或命名管道或裝置控制代碼)建立聯絡,建立聯絡的工作由程式設計師完成;

fd_zero(fd_set *fdset):清空fdset與所有檔案控制代碼的聯絡。

fd_set(intfd, fd_set *fdset):建立檔案控制代碼fd與fdset的聯絡。

fd_clr(intfd, fd_set *fdset):清除檔案控制代碼fd與fdset的聯絡。

fd_isset(intfd, fdset *fdset):檢查fdset聯絡的檔案控制代碼fd是否可讀寫,>0表示可讀寫。

2:struct timeval用來代表時間值,有兩個成員,乙個是秒數tv_sec,另乙個是毫秒數tv_usec。

(二)下面介紹select()函式原型:

1:int select(int nfds, fd_set *rdfds, fd_set *wtfds, fd_set *exfds, struct timeval *timeout)

2:ndfs:select中監視的檔案控制代碼數,一般設為要監視的檔案中的最大檔案號加一。

3:rdfds:select()監視的可讀檔案控制代碼集合,當rdfds映象的檔案控制代碼狀態變成可讀時系統告訴select函式返回。

這個集合中有乙個檔案可讀,select就會返回乙個大於0的值,表示有檔案可讀,

如果沒有可讀的檔案,則根據timeout引數再判斷是否超時,

若超出timeout的時間,select返回0,若發生錯誤返回負值,

可以傳入null值,表示不關心任何檔案的讀變化;

4:wtfds: select()監視的可寫檔案控制代碼集合,當wtfds映象的檔案控制代碼狀態變成可寫時系統告訴select函式返回。

如果這個集合中有乙個檔案可寫,select就會返回乙個大於0的值,表示有檔案可寫,

如果沒有可寫的檔案,則根據timeout引數再判斷是否超時,

若超出timeout的時間,select返回0,若發生錯誤返回負值,

可以傳入null值,表示不關心任何檔案的寫變化。

5:exfds:select()監視的異常檔案控制代碼集合,當exfds映象的檔案控制代碼上有特殊情況發生時系統會告訴select函式返回。

6:timeout:select()的超時結束時間。

這個引數它使select處於三種狀態,

第一,若將null以形參傳入,即不傳入時間結構,就是將select置於阻塞狀態,

一定等到監視檔案描述符集合中某個檔案描述符發生變化為止;

第二,若將時間值設為0秒0毫秒,就變成乙個純粹的非阻塞函式,不管檔案描述符是否有變化,

都立刻返回繼續執行,檔案無變化返回0,有變化返回乙個正值;

第三,timeout的值大於0,這就是等待的超時時間,即select在timeout時間內阻塞,

超時時間之內有事件到來就返回了,否則在超時後不管怎樣一定返回,返回值同上述。

7:返回值:負值:select錯誤

0:等待超時,沒有可讀寫或錯誤的檔案

正值:某些檔案可讀可寫或出錯

(三)下面是乙個有三個套接字控制代碼的例子

intsa, sb, sc;

sa = socket(...);

connect(sa,...);

sb = socket(...);

connect(sb,...);

sc = socket(...);

connect(sc,...);

fd_set(sa, &rdfds);/* 分別把3個控制代碼加入讀監視集合裡去 */

fd_set(sb, &rdfds);

fd_set(sc, &rdfds);

intmaxfd = 0;

if(sa > maxfd) maxfd = sa;/* 獲取3個控制代碼的最大值 */

if(sb > maxfd) maxfd = sb;

if(sc > maxfd) maxfd = sc;

structtimeval tv;

tv.tv_sec   = ... ;

tv.tv_usec = ...;

ret = select(maxfd + 1, &rdfds, null, null, &tv); /* 注意是最大值加1 */

if(ret < 0)

elseif(ret == 0)

else

......}

select函式使用總結

函式原型為 int select intmaxfdpl,fd set readfds,fd set writefds,fd set read exceptfds,struct timeval tvptr 1 前面文章已詳細解釋最後乙個引數,表示超時的引數,但是在除錯過程中發現設定了超時時間,但只有第...

select 函式的總結資料

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

select函式用法簡單總結

在linux中我們可以通過man 函式名,命令檢視linux程式設計手冊從而檢視乙個函式的具體用法。select函式原型為 int select int nfds,fd set readfds,fd set writefds,fd set exceptfds,struct timeval timeo...