Q:epoll是什么,有哪些接口以及实现什么功能?
A:epoll是SUS标准之外,只在Linux平台上提供的多路复用I/O接口,普遍用于高并发的网络编程,用以代替select/poll,提高并发网络I/O效率。epoll不是一个函数,而是一组函数,由epoll_create、epoll_ctl和epoll_wait组成,包含在sys/epoll.h头文件中。
- epoll_create:
int epoll_create(int size);
调用此函数内核会产生一个epoll instance数据结构并返回一个文件描述符,这个特殊的描述符就是epoll instance的句柄,后面的两个接口都以它为中心。size参数表示所要监视文件描述符的最大值,不过在目前的Linux版本中已经被弃用(调用的时候不要用0,否则会报invalid argument)
- epoll_ctl:
typedef union epoll_data {
void *ptr; /* 指向用户自定义数据 */
int fd; /* 注册的文件描述符 */
uint32_t u32; /* 32-bit integer */
uint64_t u64; /* 64-bit integer */
} epoll_data_t;
struct epoll_event {
uint32_t events; /* 描述epoll事件 */
epoll_data_t data; /* 见第一个结构体 */
};
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *ev);
对于需要监视的文件描述符集合,epoll API使用interest list进行管理,list中每个成员由描述符值和所要监控的文件描述符指向的文件表项的引用等组成。epoll_ctl就是管理interest list的接口,op参数说明操作类型:
op value | meaning |
---|---|
EPOLL_CTL_ADD | 向interest list添加一个需要监视的描述符 |
EPOLL_CTL_DEL | 从interest list中删除一个描述符 |
EPOLL_CTL_MOD | 修改interest list中一个描述符 |
struct epoll_event结构描述一个文件描述符的epoll行为。在使用epoll_wait函数返回处于ready状态的描述符列表时,data域是唯一能给出描述符信息的字段,所以在调用epoll_ctl加入一个需要监测的描述符时,一定要在此域写入描述符相关信息;events域是bit mask,描述一组epoll事件,在epoll_ctl调用中解释为:描述符所期望的epoll事件。常用的事件描述如下:
epoll event | meaning |
---|---|
EPOLLIN | 描述符处于可读状态 |
EPOLLOUT | 描述符处于可写状态 |
EPOLLET | 将epoll event通知模式设置成edge triggered |
EPOLLONESHOT | 第一次进行通知,之后不再监测 |
EPOLLHUP | 本端描述符产生一个挂断事件,默认监测事件 |
EPOLLRDHUP | 对端描述符产生一个挂断事件 |
EPOLLPRI | 由带外数据触发 |
EPOLLERR | 描述符产生错误时触发,默认检测事件 |
EPOLLONESHOT:带有这个标志的描述符,在第一次处于ready状态并被epoll_wait返回之后,内核就会将此描述符标记为inactive状态,之后不会对它进行检测。
- epoll_wait