poll實現I O多路復用

2021-07-16 13:43:53 字數 1650 閱讀 6923

poll函式原型

引數說明:

fds:是乙個struct pollfd結構型別的陣列,用於存放需要檢測其狀態的socket描述符;每當呼叫這個函式之後,系統不會清空這個陣列,操作起來比較方便;特別是對於socket連線比較多的情況下,在一定程度上可以提高處理的效率;這一點與select()函式不同,呼叫select()函式之後,select()函式會清空它所檢測的socket描述符集合,導致每次呼叫select()之前都必須把socket描述符重新加入到待檢測的集合中;因此,select()函式適合於只檢測乙個socket描述符的情況,而poll()函式適合於大量socket描述符的情況;

nfds:nfds_t型別的引數,用於標記陣列

fds中的

結構體元素的總數量;

timeout:是poll函式呼叫阻塞的時間,單位:毫秒;

如果timeout==0,那麼poll() 函式立即返回而不阻塞,如果timeout==inftim(巨集 表示為-1),那麼poll() 函式會一直阻塞下去,直到所檢測的socket描述符上的感興趣的事件發生是才返回

函式返回值:

poll函式的返回值與select函式的返回值一樣。

若返回0:表示超時

若為-1:錯誤

若》0:返回就緒事件的個數

#include#include#include#includeint main(int argc,char* argv)

//建立陣列,用以指定我們感興趣的檔案描述符上發生的可讀、可寫和異常等事件

// struct pollfd

// ;

struct pollfd fds[2]; //檔案描述符

fds[0].fd=0;

fds[0].events=pollin; //對讀事件感興趣

fds[0].revents=0;//輸出型

fds[1].fd=1;

fds[1].events=pollout;//對寫事件感興趣

fds[1].revents=0;

char buf[1024];

int done=0;

int i=0;

int timeout=5000;//5000毫秒,即5秒

poll函式的缺點:

(1)大量的fd的陣列被整體複製於使用者態和核心位址空間之間,而不管這樣的複製是不是有意義。

(2)與select一樣,poll返回後,需要輪詢poolfd來獲取就緒的描述符。

poll函式的優點:

(1)poll函式不要求計算最大檔案描述符的大小

(2)poll函式在應付大數目的檔案描述符的時候速度更快,相比於select

(3)它沒有最大連線數的限制,原因是它基於鍊錶來儲存的。

I O多路復用 poll

函式結構 int poll struct pollfd fds,nfds t nfds,int timeout 引數 返回值 和select一模一樣 events和revents events 關注事件 讀就緒 寫就緒 異常 輸入的時候起作用 revents 輸出結果,輸出的時候起作用 輸入輸出引數...

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使用三個點陣圖來...