一. epoll简介
作为linux下的IO多路复用神器,一经问世便得到了众多程序员的赞赏,其出色的绑定 fd 监听事件能力使其在有 x 个事件同时触发时能够在O(x)时间内处理到激活的事件,此非select和poll所能比。
在linux环境下,使用epoll作为libev的后端支持是极好的选择。
二. libev中对epoll的封装
1. ev_epoll.c文件
libev能够在编译时依赖系统的宏定义来自动选择恰当的后端事件循环支撑。linux下,首选epoll。libev对epoll进行了一次简单的封装,代码位于ev_epoll.c
文件。
2. 主要使用的epoll相关函数
epoll_create
epoll_create() returns a file descriptor referring to the new epoll instance. This file descriptor is used for all the sub‐sequent calls to the epoll interface. When no longer required, the file descriptor returned by epoll_create() should be closed by using close(2). When all file descriptors referring to an epoll instance have been closed, the kernel destroys the instance and releases the associated resources for reuse.
一言以蔽之: 这个系统调用会在创建一个epoll实例,返回一个与该实例相关连的 epfd 供后续epoll类函数调用
epoll_ctl
This system call performs control operations on the epoll(7) instance referred to by the file descriptor epfd. It requests that the operation op be performed for the target file descriptor, fd.
一言以蔽之: 这个系统调用用来往 epoll_create 返回的 epfd 相关联的epoll实例内 添加/修改/删除监听事件
epoll_wait
The epoll_wait() system call waits for events on the epoll(7) instance referred to by the file descriptor epfd. The memory area pointed to by events will contain the events that will be available for the caller. Up to maxevents are returned by epoll_wait(). The maxevents argument must be greater than zero.
一言以蔽之: 此系统调用用来等待通过 epoll_ctl 往 epfd 相关的 epoll 实例内添加的事件就绪
3. epoll封装函数分析
a. epoll_modify
函数原型: void epoll_modify (EV_P_ int fd, int oev, int nev)
函数说明: 用来往epoll中添加或修改 fd关联的事件
参数说明: EV_P_
宏留在下文介绍,fd 即为往epoll中待添加或修改事件所关联的fd,oev为old event,nev为new event
功能实现: 调用epoll_ctl来实现添加/修改
核心代码:
struct epoll_event ev;