不同與select使用三個點陣圖來表示三個fdset的方式,poll使用⼀乙個 pollfd的指標實現。
poll函式和select函式的任務相似:等待一組檔案描述符來準備執行i/0。
引數
(1)第乙個引數 fds:
struct pollfd;
(2)第二個引數 nfds:
nfds用來表示要監視檔案描述符的數目
(3)第三個引數timeout:
timeout是乙個用毫秒表示的時間,是指定poll在返回前沒有接收事件時應該等待的時間。如果 它的值為-1,poll就永遠都不會超時。如果整數值為32個位元,那麼最大的超時週期大約是30分鐘。
poll與select相比
poll與select不同,通過乙個pollfd陣列向核心傳遞需要關注的事件,故沒有描述符個數的限制
pollfd中的events欄位和revents分別用於標示關注的事件和發生的事件,故pollfd陣列只需要被初始化一次
poll的實現機制與select類似,其對應核心中的sys_poll,只不過poll向核心傳遞pollfd陣列,然後對pollfd中的每個描述符進行poll,相比處理fdset來說,poll效率更高
poll返回後,需要對pollfd中的每個元素檢查其revents值,來得指事件是否發生
poll的優點
poll() 不要求開發者計算最大檔案描述符加一的大小
poll() 在應付大數目的檔案描述符的時候相比於select速度更快
它沒有最大連線數的限制,原因是它是基於鍊錶來儲存的。
poll的缺點
大量的fd的陣列被整體複製於使用者態和核心位址空間之間,而不管這樣的複製是不是有意義
與select一樣,poll返回後,需要輪詢pollfd來獲取就緒的描述符
伺服器監聽sock,若有客戶端連線伺服器端,列印客戶端的ip和port,
如果伺服器端監聽的是讀事件,則直接讀取內容
如果伺服器端監聽的是寫事件,則回寫一條html資訊。
poll伺服器的思路
1、有乙個struct pollfd的陣列array_pollfd來存放監聽的sock;
2、獲取乙個監聽的listen_scok;(get_listen函式獲取)
3、編寫poll_server函式,監聽檔案描述符的讀寫
完整**:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define pollfd_size 1024
//乙個 對檔案描述符事件
struct pollfd array_pollfd[pollfd_size];
/* 結構體成員詳情
struct pollfd
; */
/*獲取乙個監聽的socket*/
int get_listen(char *ip, short port)
int opt =1;
setsockopt(sock,sol_socket,so_reuseaddr,&opt,sizeof(opt));
struct sockaddr_in local;
local.sin_family = af_inet;
local.sin_port = htons(port);
local.sin_addr.s_addr =inet_addr(ip);
//bind
if(bind(sock,(struct sockaddr*)&local,sizeof(local)) < 0)
//listen
if(listen(sock,10)<0)
return sock;
}/*執行poll_server伺服器*/
void poll_server(int listen_sock)
else
}//表示沒有可用的檔案介面
if(k == pollfd_size)}}
else
if(index != 0 && array_pollfd[index].revents & pollin)
else
if(s <= 0)
}else
if(index != 0 && array_pollfd[index].revents & pollout)}}
}}int main(int argc, char* argv)
int listen_sock = get_listen(argv[1],atoi(argv[2]));
poll_server(listen_sock);
return
0;}
啟動伺服器
使用客戶端瀏覽器連線
瀏覽器回顯
Linux I O多路轉接 poll模型
1.poll模型屬於i o多路轉接模型,是對select模型的一種優化 int poll struct pollfd fds,nfd t nfds,int timeout 2.poll的優點 poll使用陣列儲存檔案描述符,所以能描述的檔案描述個數在理論上沒有上限 poll將輸入輸出型引數進行了分離...
Linux I O多路轉接poll技術
上篇部落格i o多路轉接select技術筆者已經為大家詳細介紹了select函式的使用方式以及特點。我們在文章最後總結的時候我們提到,select雖然已經很大程度上解決了i o過程中等待的問題,但是由於函式本身介面設計的不友好 能夠檢測的檔案描述符有上限,以及函式多次迴圈遍歷的效率問題導致selec...
Linux I O多路轉接select
系統提供select函式來實現多路復用輸入 輸出模型,那為什麼提供select函式?首先要知道乙個概念,一次i o分兩個部分 等待資料就緒 進行i o 減少等待資料的的比重,增加i o的比重就可以達到高效伺服器的目的。select工作原理就是減少等的比重,同時監控多個檔案描述符 或者說檔案控制代碼 ...