Linux I O多路轉接poll

2021-08-02 10:43:55 字數 2909 閱讀 3874

不同與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工作原理就是減少等的比重,同時監控多個檔案描述符 或者說檔案控制代碼 ...