公众号:
灰子学技术(Go语言,架构相关知识,正在同步更新中-ing)
epoll的系统调用很简单,只有三个,其定义如下:
int epoll_create(int size);
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);
一,epoll的实现原理就是基于这三个函数来实现的,具体步骤如下:
首先,需要调用epoll_create来创建一个epoll的文件描述符,内核会同时创建一个eventpoll的数据结构。这个数据结构里面会包含两个东西,一个是红黑树,专门用于存储epoll_ctl注册进来的fd文件描述符;另外一个是就绪链表,用来存储epoll_wait调用相关的,已经就绪的那些fd文件描述符。
struct eventpoll{
struct rb_root rbr; // 红黑树的根节点,存储着所有添加到epoll中的需要监控的事件
struct list_head rdlist;// 双链表中存放着将要通过epoll_wait返回给用户的满足条件的事件
};