epoll的基本使用方法

2021-10-08 17:40:29 字數 1804 閱讀 9555

多路io轉接伺服器,不再由應用程式自己監聽客戶端鏈結,而由核心代為監聽

epoll可顯著提高在大量併發連線中只有少量活躍連線下cpu利用率原因如下:

- 復用檔案描述符集合傳遞結果

- 只遍歷被核心io事件喚醒而加入到佇列中的fd集合

水平觸發lt和邊沿觸發et

通常邊沿觸發和非阻塞io配合使用

int epoll_create(int size);

int epoll_ctl(int epfd, int op, int fd, struct epoll_event* events);

int epoll_wait(int epfd, struct epoll_event* events, int maxevents, int timeout);

建立epoll控制代碼

#include

//int epoll_create (int size); //size 建議監聽數量,返回檔案描述符(描述符集合的根節點描述符)

控制epoll監聽的fd事件:註冊、修改、刪除

#include

intepoll_ctl

(int efd,

int op,

int fd,

struct epoll_event* events)

;// efd為根描述符

//op為動作,epoll_ctl_add, epoll_ctl_mod, epoll_ctl_del分別表示對fd進行的操作:註冊、修改、刪除

//event 表示檔案描述符fd的事件狀態

struct epoll_event

;typedef

union epoll_data_t

;

監聽

#include

intepoll_wait

(int epfd,

struct epoll_event* events,

int maxevents,

int timeout)

;// epfd

// events 事件集合,是結構體epoll_event陣列

// maxevents 事件集合size

// timeout -1: 阻塞等待,0:非阻塞等待,>0:等待時間(ms)

//psudocode

#include

伺服器監聽端檔案描述符 lfd

初始化epoll樹,獲取epoll樹根部epfd(根部檔案描述符)

將lfd加入到epoll樹?,監聽事件epollin

while(1)

epoll_wait監聽事件

檢查可讀事件集————遍歷

lfd可讀

accept連線請求並返回新cfd

將新cfd加入到epoll?上,監聽事件為epollin

其他fd(客戶端)可讀

buf接受events[i]

.fd資訊

將對應fd+event從epoll?上摘下

處理buf資訊(此處使用反射)

將fd+event新增到epoll?上,監聽可寫事件epollout

檢查可寫事件集合————遍歷

若檔案描述符可寫

寫回處理後資訊

將對應fd+event從epoll?上摘下

重新將fd+event新增到epoll樹上,監聽事件epollin

pthread的基本使用方法

今天寫了個程式,但是很鬱悶的是沒有得到預想的結果 pthread t tid int main void pthread attr t attr pthread attr init attr pthread attr setdetachstate attr,pthread create detach...

SeekBar的基本使用方法

seekbar的基本使用方法 a 什麼是 seekbar b 使用 seekbar 的步驟 i.在布局檔案當中宣告seekbar android layout width fill parent android layout height wrap content ii.實現 onseekbarch...

標籤的基本使用方法

用於執行中從opencms vfs動態包含檔案,包含的檔案被當成乙個請求的附加引數。使用一下一些屬性來標識要包含的物件檔名稱 如果這些屬性都沒有設定,標籤的標籤體將使用別的方法得到檔名稱.注意 如果不能通過上訴方法得到包含的檔名稱,就會呼叫 當前cmsrequestcontext的 geturi 方...