當epoll_wait發現response_events[]中的fd發生變化時,自動代用ptr指向的回調函數。這樣子可以再次提高一點效率。
- 傳統
epoll – Server – Listen — cfd — 可讀 — epoll返回 — read – 回顯 --epoll繼續監聽。 - 反應堆
- 流程
- 爲什麼讀完之後要從樹上摘下來,然後改成監聽寫事件再掛到樹上
- 設置EPOLLOUT後epoll_wait()是如何工作的
- -水平模式:struct epoll_event ev;
- ev.events = EPOLLOUT–>檢查寫緩衝區是否可寫
- epoll_wait會一直返回,緩衝區能寫數據,該函數會返回,緩衝區滿的時候,不返回
- -邊緣模式:
- 第一次設置的時候epoll_wait會返回一次
- 緩衝區從滿到不滿的時候
- -水平模式:struct epoll_event ev;
- 爲了保證寫的數據一定能發送出去
- 設置EPOLLOUT後epoll_wait()是如何工作的
- epoll_evet.data.ptr
epoll_event.data.fd —>epoll_event.data.ptr
struct myevent_s {
int fd; //要監聽的文件描述符
int events; //對應的監聽事件
void *arg; //泛型參數
void (*call_back)(int fd, int events, void *arg); //回調函數
int status; //是否在監聽:1->在紅黑樹上(監聽), 0->不在(不監聽)
char buf[BUFLEN];
int len;
long last_active; //記錄每次加入紅黑樹 g_efd 的時間值
};
- epoll_event.data.ptr