当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