1.内核事件表
epoll是Linux特有的I/O复用函数,首先,epoll使用一组函数来完成任务,而不是单个函数.其次,epoll把用户关心的文件描述符上的事件放在内核里的一个事件表中,epoll需要使用一个额外的文件描述符,来唯一标识内核的这个事件表.
#include<sys/epoll.h>
int epoll_create(int size)
size只是告诉内核,事件表需要多大.该函数返回的文件描述符将用作其他所有的epoll系统调用的第一个函数,指定要返回的文件描述符
#include <sys/epoll.h>
int epoll_ctl(int epfd,int op, int fd, struct epoll_event * event)
fd参数是要操作的文件描述符,op参数是指定操作类型,操作类型有下面几种:
EPOLL_CTL_ADD,往事件表中注册fd上的事件
EPOLL_CTL_MOD,修改fd上的注册事件
EPOLL_CTL_DEL,删除fd上的注册事件
event参数指定事件,它是epoll_event结构指针类型,epoll_event的定义如下
struct epoll_event
{
_unit32_t events;//epoll事件
epoll_data_t data;//用户数据
}
其中events成员描述事件类型.epoll支持的事件类型和poll基本相同.表示epoll事件类型的宏在poll对应的宏前加"E"
, data成员用于存储用户数据,epoll_data_t的定义如下:
typedef union epoll_data
{
void * ptr;
int fd;
uint32_tu32;
uint64_t u64;
}
epoll_data是一个联合体,其中4个成员中使用最多的fd,它指定事件所属的目标文件描述符,ptr成员可用来指定与fd相关的用户数据,epoll_data_t是一个联合题,不能同时使用ptr和fd成员,将文件描述符和用户数据关联起来,以实现快速的数据访问
2.epoll_wait函数
epoll系列系统调用的主要接口是epoll_wait函数,它在一端超时时间里等待一组文件描述符上的事情
#include<sys/epoll.h>
int epoll_wait(int epfd,struct epoll_event* events,int maxevents,int timeout)
该函数成功返回就绪的文件描述符的各数
timeout参数的含义与poll接口的timeout参数相同.maxevents参数指定最多监听多少个时间,它必须大于0。
epoll_wai