Select的函式格式

2021-06-18 11:52:27 字數 1680 閱讀 2350

int select(int maxfdp,fd_set *readfds,fd_set *writefds,fd_set *errorfds,struct timeval *timeout);

先說明兩個結構體:

第一,struct fd_set可以理解為乙個集合,這個集合中存放的是檔案描述符(filedescriptor),即檔案控制代碼,這可以是我們所說的普通意義的檔案,當然unix下任何裝置、管道、fifo等都是檔案形式,全部包括在內,所以毫無疑問乙個socket就是乙個檔案,socket控制代碼就是乙個檔案描述符。

fd_set集合可以通過一些巨集由人為來操作,

清空集合fd_zero(fd_set *);

將乙個給定的檔案描述符加入集合之中fd_set(int ,fd_set*);

將乙個給定的檔案描述符從集合中刪除fd_clr(int,fd_set*);

檢查集合中指定的檔案描述符是否可以讀寫fd_isset(int ,fd_set* )

第二,struct timeval是乙個大家常用的結構,用來代表時間值,有兩個成員,乙個是秒數,另乙個是毫秒數。

具體解釋select的引數:int maxfdp是乙個整數值,是指集合中所有檔案描述符的範圍,即所有檔案描述符的最大值加1,不能錯!在windows中這個引數的值無所謂,可以設定不正確。

fd_set*readfds是指向fd_set結構的指標,這個集合中應該包括檔案描述符,我們是要監視這些檔案描述符的讀變化的,即我們關心是否可以從這些檔案中讀取資料了,如果這個集合中有乙個檔案可讀,select就會返回乙個大於0的值,表示有檔案可讀,如果沒有可讀的檔案,則根據timeout引數再判斷是否超時,若超出timeout的時間,select返回0,若發生錯誤返回負值。可以傳入null值,表示不關心任何檔案的讀變化。

fd_set*writefds是指向fd_set結構的指標,這個集合中應該包括檔案描述符,我們是要監視這些檔案描述符的寫變化的,即我們關心是否可以向這些檔案中寫入資料了,如果這個集合中有乙個檔案可寫,select就會返回乙個大於0的值,表示有檔案可寫,如果沒有可寫的檔案,則根據timeout引數再判斷是否超時,若超出timeout的時間,select返回0,若發生錯誤返回負值。可以傳入null值,表示不關心任何檔案的寫變化。

fd_set *errorfds同上面兩個引數的意圖,用來監視檔案錯誤異常。

struct timeval *timeout是select的超時時間,這個引數至關重要,它可以使select處於三種狀態,

1)若將null以形參傳入,即不傳入時間結構,就是將select置於阻塞狀態,一定等到監視檔案描述符集合中某個檔案描述符發生變化為止;2)若將時間值設為0秒0毫秒,就變成乙個純粹的非阻塞函式,不管檔案描述符是否有變化,都立刻返回繼續執行,檔案無變化返回0,有變化返回乙個正值;3)timeout的值大於0,這就是等待的超時時間,即select在timeout時間內阻塞,超時時間之內有事件到來就返回了,否則在超時後不管怎樣一定返回,返回值同上述。

返回值:負值:select錯誤 正值:某些檔案可讀寫或出錯 0:等待超時,沒有可讀寫或錯誤的檔案

linux socket的select函式例子

使用select函式可以以非阻塞的方式和多個socket通訊。程式只是演示select函式的使用,功能非常簡單,即使某個連線關閉以後也不會修改當前連線數,連線數達到最大值後會終止程式。1.程式使用了乙個陣列fd a,通訊開始後把需要通訊的多個socket描述符都放入此陣列。2.首先生成乙個叫sock...

select函式的使用

select 函式 系統提供 select 函式來實現多路復用輸入 輸出模型。原型 include sys time.h include unistd.h select 函式 系統提供 select 函式來實現多路復用輸入 輸出模型。原型 include sys time.h include uni...

linux socket的select函式例子

使用select函式可以以非阻塞的方式和多個socket通訊。程式只是演示select函式的使用,功能非常簡單,即使某個連線關閉以後也不會修改當前連線數,連線數達到最大值後會終止程式。1.程式使用了乙個陣列fd a,通訊開始後把需要通訊的多個socket描述符都放入此陣列。2.首先生成乙個叫sock...