Linux系統IO多路復用之select

2021-10-04 00:13:37 字數 1685 閱讀 4905

#include#includeint select(int maxfd, fd_set *readset, fd_set *writeset, fd_set *exceptset, const struct timeval *timeout);
引數介紹:

maxfd:最大描述符數量+1

readset:指定核心測試讀的描述符集合

writeset:指定核心測試寫的描述符集合

excepset:指定核心測試異常的描述符集合

timeout:告知核心等待所指定描述符中任何乙個就緒可花費的最長時間。這個引數有如下三種可能:

//timeval結構

struct timeval ;

返回值:有就緒描述符則為其數目,若超時則為0,若出錯則為-1.

儘管timeval結構允許我們指定乙個微秒級的解析度,然而核心支援的真實解析度卻粗糙很多。舉例來說,許多unix核心把超時值向上捨入成10ms的倍數。另外還涉及排程延遲,也就是說定時器到後,核心還需要花一點時間排程相應程序執行。值得一提的是timeval結構能夠表達select不支援的值。

彩蛋:若select函式中readset、writeset以及exceptset均為空指標,我們就會得到乙個比sleep更加精確的定時器。

fd_set資料結構
void fd_zero(fd_set *fdset) /*清空fd_set*/

void fd_set(int fd, fd_set *fdset) /*將fd新增進fd_set*/

void fd_clr(int fd, fd_set *fdset) /*將fd從fd_set中移出*/

int fd_isset(int fd, fd_set *fdset) /*判斷fd是否在fdset中*/

select函式修改有指標readset、writeset和exceptset所指向的描述符集,因而這三個引數都是值-結果引數。呼叫該函式時,我們指定所關心的描述符的值,該函式返回時,結果將指示哪些描述符已就緒。該函式返回之後,可以使用fd_isset巨集來測試fd_set來測試fd_set資料型別中的描述符。描述符集內任何與未就緒描述符對應的位返回時均被清零。為此,每次重新呼叫select函式時,都需要再次把所有描述符集內所關心的位置為1。

描述符就緒條件

滿足下列任意條件時,套接字讀就緒:

可用通過so_rcvlowat套接字選項設定套接字的低水位標記。對於tcp和udp套接字而言,其預設值為1。

滿足下列任意條件時,套接字寫就緒:

可以通過so_sndlowat套接字選項來設定該套接字的低水位標誌。對於tcp和udp套接字而言,其預設值為2048。

select的最大描述符數

最初設計select時,作業系統對每個程序可用的最大描述符設定了上限,select一般就使用這個上限作為最大描述符數。而現在的作業系統對每個程序可用的描述符數不再限制(只受限於記憶體),若要增大select最大連線數,可以在或中修改fd_setsize的值,然後重新編譯核心。

Linux系統IO多路復用之epoll

epoll create函式int epoll create int size 建立乙個epoll的控制代碼,size指定需要監聽描述符的最大數量。該函式返回乙個fd,在使用完epoll之後需要呼叫close 關閉,否則可能導致fd耗盡。epoll ctl函式int epoll ctl int ep...

I O多路復用之poll

poll的優點 1 poll 不要求開發者計算最大檔案描述符加一的大小。2 poll 在應付大數目的檔案描述符的時候速度更快,相比於select。3 它沒有最大連線數的限制,原因是它是基於鍊錶來儲存的。poll的缺點 1 大量的fd的陣列被整體複製於使用者態和核心位址空間之間,而不管這樣的複製是不是...

I O多路復用之select

阻塞i o模型 應用程式呼叫乙個i o函式,應用程式會一直等待資料準備好。如果資料沒有準備好,就會一直等待。只有當資料準備好,從核心拷貝到使用者空間io函式才成功返回。非阻塞i o模型 把乙個套介面設定成非阻塞告訴核心,當所有的i o操作無法完成時,不要將程序睡眠,而返回乙個錯誤資訊。此時i o操作...