回憶一下 select介面
intselect(int
nfds, fd_set
*readfds, fd_set
*writefds, fd_set
*exceptfds,
struct
timeval
*timeout);
select需要我們指定檔案描述符的最大值,然後取[0,nfds)這個範圍內的值檢視是在集合readfds,writefds或execptfds中,也就是說這個範圍內存在一些不是我們感興趣的檔案描述符,cpu做了一些無用功,poll對她進行了改進,下面就看看poll是怎麼做的。
#include
intpoll(struct pollfd *fds, nfds_t nfds, int timeout);
跟select不同的是,poll不再告知核心乙個範圍,而是通過struct pollfd結構體陣列精確的告知核心使用者關心哪些檔案描述符(流)。引數nfds指示結構體陣列的大小。timeout表示程式設計師的忍耐度,有三種取值:
下面來看一下struct pollfd結構體,以及其中的事件有哪些取值,及其含義
struct pollfd ;
events 和 revents能夠設定的值都定義在頭中,有以下幾種可能
poll函式返回值,有三種可能
當poll返回值為-1時,表示poll出錯,errno將被設定,errno的取值有4種可能
使用poll()和select()不一樣,你不需要顯式地請求異常情況報告。
pollin | pollpri等價於select()的讀事件,pollout |pollwrband等價於select()的寫事件。pollin等價於pollrdnorm |pollrdband,而pollout則等價於pollwrnorm。
poll的功能和select的功能一樣,只不過是引數稍微不同,poll的底層原理也和select差不多,就不多說了,i/o多路復用之select
I O多路復用之poll
poll的優點 1 poll 不要求開發者計算最大檔案描述符加一的大小。2 poll 在應付大數目的檔案描述符的時候速度更快,相比於select。3 它沒有最大連線數的限制,原因是它是基於鍊錶來儲存的。poll的缺點 1 大量的fd的陣列被整體複製於使用者態和核心位址空間之間,而不管這樣的複製是不是...
IO多路復用之poll
poll和select區別 poll伺服器監視的檔案描述符無上限 poll將輸入 輸出引數進行分離。一 poll函式 函式格式如下所示 include int poll struct pollfd fds,unsigned int nfds,int timeout 不同與select使用三個點陣圖來...
I O多路復用之poll
poll函式和select函式非常相似,但是函式介面不一樣。include int poll struct pollfd fdarray,unsigned long nfds,int timeout 返回 就緒描述字的個數,0 超時,1 出錯 第乙個引數是指向乙個結構陣列第乙個元素的指標。每個陣列元...