函式原型
#include
#include
#include
int select(int nfds, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, struct timeval *timeout);
void fd_clr(int fd, fd_set *set);
int fd_isset(int fd, fd_set *set);
void fd_set(int fd, fd_set *set);
void fd_zero(fd_set *set);
#include
int pselect(int nfds, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, const struct timespec *timeout,
const sigset_t *sigmask);
這個引數看似很簡單,是當前監聽套接字的最大值+1
其實這個nfds其實填進去的就是maxfd+1 , 而maxfd是當前監聽訊號的最大值,比如監聽0(鍵盤) 及tcp通訊中的套接字。一般是從3開始增長。
如果建立乙個tcp通訊模型, 建立乙個伺服器那麼就會產生乙個3號的套接字,相當於檔案描述符。可以利用檔案io進行讀寫操作。那麼在利用select實現io多了復用時就會產生監聽3這個套接字。因此此時的maxfd = 3 , 那麼ndfs = maxfd + 1 = 4 ; 其實這個ndfs就像乙個空間,或者位置,儲存乙個遞增的資料。這個數字可以是tcp套接字也可以是檔案描述符。
比如如果監聽 3 , 4 , 5 , 6 , 7這5個檔案描述符,或者套接字, 那麼就需要8個位置,因為,檔案描述符是從0開始的。 如果此時你將nfds置為8那麼一切正常,1號位置麼有內容, 知道4號位置 存放3 監聽 , 5號位置存4 6號位置存5 , 7號位置存6 , 8號位置存7 。 切記不能因為這裡只有5個需要監聽的物件就將nfds = 5 , 如果置5 說明只有5個位置,但是nfds裡面只能存放連續的監聽物件(檔案描述符)如果中間監聽物件預設,可以不堅聽,但是位置一定要保留。所以對於以上的情況 nfds為最大的fd = 7 加上1 即maxfd = 7 nfds = maxfd+1 = 8;
linux中select 函式相關
select 的機制中提供一fd set的資料結構,實際上是一long型別的陣列,每乙個陣列元素都能與一開啟的檔案控制代碼 不管是socket控制代碼,還是其他 檔案或命名管道或裝置控制代碼 建立聯絡,建立聯絡的工作由程式設計師完成,當呼叫select 時,由核心根據io狀態修改fd set的內容,...
select函式中的演算法
先討論與io無關的東西.呼叫select 的流程是 1 將要監聽的檔案描述符 集 a,b,c選入乙個集合s 2 呼叫select,可以設定超時引數 4 函式內部設定s集合中的描述符 3 函式返回,解析s中還有哪些述符 怎樣高效的來實現上述的過程.我們知道檔案描述符是乙個較小遞增不重複的int,根據這...
linux中select 函式分析
select 的機制中提供一fd set的資料結構,實際上是一long型別的陣列,每乙個陣列元素都能與一開啟的檔案控制代碼 不管是socket控制代碼,還是其他 檔案或命名管道或裝置控制代碼 建立聯絡,建立聯絡的工作由程式設計師完成,當呼叫select 時,由核心根據io狀態修改fd set的內容,...