1 #include <sys/epoll.h>
2 int epoll_create(int size);//创建一个epfd,标识内核中的事件表
3 int epoll_ctl(int epfd, int op,int fd, struct epoll_event *event);//向epfd中添加,删除,修改事件
4 int epoll_wait(int epfd, structepoll_event * events, int maxevents, int timeout);//从epfd中取出实际发生的事件
epoll使用一组函数来完成任务,将用户感兴趣的fd上的事件放在内核里的一个事件表中,epoll使用一个额外的fd来唯一标识内核中的这个事件表。
int epoll_create(int size);
size:给内核一个提示,告诉内核事件表需要多大;
返回值:返回一个fd,标识内核事件表;
int epoll_ctl(int epfd, int op,int fd, struct epoll_event *event);
epfd:标识内核事件表的fd;
op:指定操作类型;
EPOLL_CTL_ADD-向epfd上注册fd上的事件;EPOLL_CTR_MOD-修改fd上注册的事件;EPOLL_CTL_DEL-删除fd上注册的事件;
fd:要操作的fd;
event:epoll_event结构指针类型(含epoll的事件类型和事件对应的fd)
1 struct epoll_event
2 {
3 _uint32_t events; //epoll的事件类型
4 epoll_data_t data; //联合体,存储用户数据
5 };
6
7 typedef union epoll_data
8 {
9 void* ptr;
10 int fd; //事件所从从属的fd,使用最多
11 uint32_t u32;
12 uint64_t u64;
13 }epoll_data_t; //联合体,同一时刻只能保存一个成员的值
epoll的事件类型:
EPOLLIN-数据可读;EPOLLRDNORM-普通数据可读;EPOLLRDBAND-优先级带数据可读;EPOLLPRI-高优先级数据可读;
EPOLLOUT-数据可写;EPOLLWRNORM-普通数据可写;EPOLLWRBAND-优先级带数据可写;
EPOLLRDHUP-TCP连接对方关闭或者对方关闭了写操作;
EPOLLERR-错误;EPOLLHUP-挂起;EPOLLNVAL-fd没有打开;
EPOLLET,EPOLLONESHOT.
返回值:调用成功,返回0;调用失败,返回-1。
int epoll_wait(int epfd, structepoll_event * events, int maxevents, int timeout);
epfd:标识内核事件表的fd;
events:epoll_event结构类型的红黑树(红黑树的元素为结构体);
maxevents:监听fd的数量;
timeout:设置epoll的超时时间,单位为毫秒;
返回值:timeout=0,epoll_wait调用立即返回;timeout=-1,epoll_wait调用阻塞,直到某个事件发生。
调用成功,返回就绪的数量;调用失败,返回-1并设置errno。
epoll_wait函数如果检测到就绪事件,就将就绪事件从epfd标识的内核事件表中复制到events指向的红黑树中(仅含检测到的就绪事件)。
原文:https://www.cnblogs.com/yongjin-hou/p/14350023.html