select詳解及其限制

2021-07-01 21:13:30 字數 2538 閱讀 5821

前言:筆者前幾天參加面試,被問到select

函式的限制,然後感覺一頭霧水,回來之後趕緊查詢了資料彌補知識短板,也意識到以後使用一些系統呼叫應該多想些為什麼,結合現實去思考實際中會遇到的問題。

下面是對selecth

函式的一些總結:

select是網路

io模型中的

io復用

(在之前筆者還以為

select

屬於非同步

io),了解

select

之前大家可以先了解下

io網路io

模型:io - 同步,非同步,阻塞,非阻塞 (亡羊補牢篇) - 智障大師 的專欄 - 部落格頻道 - csdn.net

網路io之阻塞、非阻塞、同步、非同步總結 - anker's blog - 

i/o復用之select:

int select( int 

nfds

,                            

fd_set *

readfds

,                

fd_set *

writefds

,              

fd_set  *

exceptfds

,              

const struct timeval  *

timeout );

一、引數: 1、

int nfds:select監視的

檔案控制代碼

數,視程序中開啟的檔案數而定,

一般設為你要監視各檔案中的最大檔案號加一。

2、readfds:

select

監視的可讀

檔案控制代碼

集合。

當rdfds映象的檔案控制代碼狀態變成可讀時系統告訴select函式返回。

這個集合中有乙個檔案可讀,select就會返回乙個大於0的值,表示有檔案讀,如果沒有可讀的檔案,則根據timeout引數再判斷是否超時,若超出timeou

t的時間,select返回0,若發生錯誤返回負值,可以傳入null值,表示不關心任何檔案的讀變化 3、

writefds: select監視的可寫

檔案控制代碼

集合。

當wtfds映象的檔案控制代碼狀態變成可寫時系統告訴select函式返回。

如果這個集合中有乙個檔案可寫,select就會返回乙個大於0的值,表示有檔案可寫,如果沒有可寫的檔案,則根據timeout引數再判斷是否超時,若超出timeout的時間,select返回0,若發生錯誤返回負值,可以傳入null值,表示不關心任何檔案的寫變化。 4、

exceptfds:

select

監視的異常

檔案控制代碼

集合。

當exfds映象的檔案控制代碼上有特殊情況發生時系統會告訴select函式返回。 5、

timeout:本次

select()

的超時結束時間。(見

/usr/sys/select.h

,可精確至百萬分之一秒!)

這個引數

有以下三種可能: 1、

引數設為空指標:永遠等待下去:僅在有乙個檔案描述符準備好i/o時才返回。 2、

3、根本不等待;檢查描述符後立即返回,這稱為輪詢(polling)。為此,該引數必須指向timeout結構,而且其中的定時器值必須是0.

這裡涉及到兩個結構體:

1、struct fd_set:存放檔案描述符(flie descriptor)的集合,即檔案控制代碼的集合,實際上是long型別的陣列,每乙個陣列元素都能與一開啟的檔案控制代碼(不管是socket控制代碼,還是其他檔案或命名管道或裝置控制代碼)建立聯絡,建立聯絡的工作由程式設計師完成。如下:

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

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

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

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

0表示可讀寫。

2、struct timeval用來表示時間值,有兩個成員,乙個是秒數tv_sec,另乙個是毫秒tv_usec.

二、返回值:

負值:select錯誤

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

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

控制代碼數限制

select 最不能忍受的是乙個程序所開啟的fd是有一定限制的,由fd_setsize設定,預設值是1024。對於那些需要支援的上萬連線數目的im伺服器來說顯然太少了。這時候你一是可以選擇修改這個巨集然後重新編譯核心,不過資料也同時指出這樣會帶來網路效率下降

。(不過 epoll則沒有這個限制,它所支援的fd上限是最大可以開啟檔案的數目,這個數字一般遠大於2048,舉個例子,在1gb記憶體的機器上大約是10萬左右,具體數目可以cat /proc/sys/fs/file-max檢視,一般來說這個數目和

系統記憶體

關係很大。)

select 函式及其應用

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

select函式詳解及其在I O復用模型中的應用

一.select函式詳解 include include int select int maxfdp1,fd set readset,fd set writeset,fd set excptset,const strcut timeval timeout 返回 准有就緒的檔案描述數量,若超時則返回0...

select函式詳解

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