epoll之二 epoll實戰

2021-07-13 20:40:19 字數 1873 閱讀 1227

int epoll_create(int size);
epoll_create返回 乙個控制代碼,之後epoll的 使用都將依靠這個 控制代碼 來 標識,引數 size是告訴epoll所要處理的大致事件數目,不再使用epoll時,必須呼叫close 關閉這個控制代碼。

size這個引數只是 告訴核心這個epoll物件會處理的事件大致數目,而不是 能夠處理 的事件的最大個數

int epoll_ctl(int epfd,int op,int fd,struct epoll_event*event);
epoll_ctl向epoll物件中新增、修改或是刪除感興趣的事件,返回0表示成功,否則 返回-1,此時要根據 errno錯誤 碼判斷錯誤型別,epoll_wait方法返回的 事件必然通過epoll_ctl新增到epoll中的。引數epfd是epoll_create返回的控制代碼。

引數op的意義表:

op的取值

意義epoll_ctl_add

新增新的事件到epoll中

epoll_ctl_mod

修改epoll中的 事件

epoll_ctl_del

刪除epoll中的事件

第三個引數fd是待監測的連線套接字,第四個 引數是 告訴 epoll對什麼樣的事件感興趣,使用了epoll_event結構體,前面介紹過了epoll實現機制中會對每乙個事件建立epitem 結構體,而 在 epitem中有乙個epoll_event型別的event成員

struct epoll_event;
表 epoll_event中的events的 取值 意義
events的值

意義epollin

表示對應的連線上 有資料可以讀出

epollout

表示對應的 連線上可以寫入 資料傳送

epollrdhup

表示tcp連線的遠端 關閉或是半關閉連線

epollpri

表示對應的連線上 有緊急資料需要讀

epollerr

表示對應的連線上發生 錯誤

epollhup

表示對應的連線已經掛起

epollet

表示觸發方式設定為邊緣觸發(et)系統預設是水平 觸發(lt)

epolloneshot

表示對 這個事件只處理 一次,下次需要處理時要重新加入epoll

而data成員是乙個epoll_data聯合,定義如下:

typedef

union epoll_dataepoll_data_t;

data這個成員還與具體使用方式相關,ngx_epoll_module模組只使用了 聯合的ptr成員,作為指向ngx_connection_t連線的指標。

int epoll_wait(int epfd,struct epoll_event *  events,int maxevents,int timeout);
收集在epoll監控的 事件中已經發生的 事件,如果 epoll中沒有任何 乙個事件 發生,則 最多等待timeout毫秒返回,epoll_wait的 返回值表示當前發生事件的個數,入果返回0,則表示沒事件發生,如果為-1,表示出現錯誤,需要檢查errno錯誤型別判斷錯誤型別。第一引數epfd是epoll的描述符,第二個引數events則是分配好的epoll_event結構體陣列,epoll將會把發生的事件複製到events陣列中,第三個引數maxevents表示本次可以返回的最大次數數目,通常來說maxevents和預分配的events陣列大小是相等。第四個引數timeout表示沒有檢測到,最多等待的時間(單位為毫秒)。

詳細見部落格io復用之select poll epoll 函式

epoll邊緣觸發 Epoll筆記

下圖為epoll的流程圖 epoll一共兩種模式,水平觸發 lt 和邊緣觸發 et 主要的區別在於對讀,寫資料的處理 lt初始化 epoll ctrl connect socket,epollin,add lt讀 void lt handle read if n 0 errno eagain lt寫...

epoll監聽檔案 epoll的使用

epoll i o event notification facility 在linux的網路程式設計中,很長的時間都在使用select來做事件觸發。在linux新的核心中,有了一種替換它的機制,就是epoll。相比於select,epoll最大的好處在於它不會隨著監聽fd數目的增長而降低效率。因為...

epoll程式設計

本章節是用基本的linux基本函式加上epoll呼叫編寫乙個完整的伺服器和客戶端例子,可在linux上執行,客戶端和服務端的功能如下 客戶端從標準輸入讀入一行,傳送到服務端 服務端從網路讀取一行,然後輸出到客戶端 客戶端收到服務端的響應,輸出這一行到標準輸出 如下 1 include2 includ...