epoll_creat()
int epoll_create(int size);
创建epoll模型。
本质:在OS创建epoll模型,在OS中有就绪队列、红黑树、网络协议栈和底层驱动之间建立回调机制,当事件就绪时,采用回调机制向就绪队列之间插入就绪事件。
epoll_ctl()
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
用户告知内核,需要帮我关注一下哪些fd上的哪些事件。
本质:向红黑树之中设置节点以及数据(文件描述符和要关心的事件),本质就是修改红黑树。
epoll_wait()
int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);
内核告知用户,哪些fd上的哪些事件已经就绪。
本质:通过检测就绪队列,从就绪队列中拿出就绪事件

epoll有两种工作方式——水平触发(LT)和边缘触发(ET)
epoll默认状态下就是水平触发工作模式
ET工作模式下,recv或者write必须处于非阻塞模式下进行读取
原因:处于ET模式下,因为只会通知一次就绪,所以要求必须将所有的事件读取完毕,这样就要求在recv时是循环式的,就有可能会存在在最后一次读取时,存在是0的情况,在这种情况下,调用recv就会阻塞,这样进程就会被挂起,服务器将无法响应任何外部事件,所以就要求在ET模式下,必须是处在非阻塞模式下的。