零、实例代码:https://github.com/xuchanglong/NtyTCP-v1.0.0-comments
一、主要接口
int epoll_create(int size);
创建 epoll 对象,创建一颗空的红黑树,一个空双向链表。
int epoll_ctl(int epid, int op, int sockid, struct epoll_event *event);
向 epoll 对象里面的红黑树中增加、删除、修改指定的节点。
int epoll_wait(int epid, struct epoll_event *events, int maxevents, int timeout);
等待双向链表中是否有节点,若有节点则取得不大于 maxevents 数量的节点并放入 events 中,最后返回。
int epoll_event_callback(struct eventpoll *ep, int sockid, uint32_t event)
有显卡驱动调用,判断当前事件(建立连接、断开连接、读写数据)对应的 socket 是否已经在红黑树中挂号,如果是,则将新的事件保存到对应的红黑树节点中并更新到双向链表中。
二、原理说明
1、上文在说明函数功能时提到了两个 epoll 核心结构:红黑树 和 双向链表 。
- 红黑树的功能是保存待监控的 socket 以及其事件的信息。
- 双向链表的功能是保存就绪的 socket 以及其事件的信息。
2、eventpoll 和 红黑树、双向链表的关系图如下所示:
(SAW:Game Over!)