多路复用IO---epoll
一、epoll_create函数
函数声明:int epoll_create(int size)
该函数生成一个epoll专用的文件描述符。它其实是在内核申请一空间,用来存放你想关注的socket fd上是否发生以及发生了什么事件。size就是你在这个epoll fd上能关注的最大socket fd数。
二、epoll_ctl函数
函数声明:int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event)
功能:用于控制某个文件描述符上的事件,可以注册事件,修改事件,删除事件。
epfd:由epoll_create生成的epoll专用的文件描述符;
op:要进行的操作,EPOLL_CTL_ADD注册、EPOLL_CTL_MOD修改、EPOLL_CTL_DEL删除;
fd:关联的文件描述符;
event:指向epoll_event的指针;
成功:0;失败:-1
三、epoll_wait函数
函数声明:int epoll_wait(int epfd,struct epoll_event * events,int maxevents,int timeout)
功能:该函数用于轮询I/O事件的发生;
epfd:由epoll_create生成的epoll专用的文件描述符;
epoll_event:用于回传待处理事件的数组;
maxevents:每次能处理的事件数;
timeout:等待I/O事件发生的超时值;
成功:返回发生的事件数;失败:-1
四、struct epoll_event
结构体epoll_event被用于注册所感兴趣的事件和回传所发生待处理的事件。
typedef union epoll_data { void *ptr; int fd; __uint32_t u32; __uint64_t u64; } epoll_data_t; //保存触发事件的某个文件描述符相关的数据 struct epoll_event { __uint32_t events; /* epoll event */ epoll_data_t data; /* User data variable */ };
其中events表示感兴趣的事件和被触发的事件,可能的取值为:
EPOLLET ET的epoll工作模式
EPOLLHUP 表示对应的文件描述符被挂断
EPOLLERR 表示对应的文件描述符发生错误
EPOLLPRI 表示对应的文件描述符有紧急的数可读
EPOLLOUT 表示对应的文件描述符可以写
EPOLLIN 表示对应的文件描述符可以读