IO多路复用——epoll(20250307)
1. epoll
优点:
- epoll创建内核事件表,不受到文件描述符上限限制 (红黑树) O(logn)
- epoll监听的事件表在内核中,直接在内核中监测事件效率高
- epoll会直接获得产生事件的文件描述符的信息,而不需要遍历检测
- epoll既能工作在水平触发模式,也能工作在边沿触发模式
2. epoll模型
- epoll_create 创建epoll文件描述符集合
- epoll_ctl 添加关注的文件描述符
- epoll_wait 监控io事件
- epoll_ctl 从事件集合中删除完成的文件描述符
2.1 epoll_create
int epoll_create(int size);
功能:
创建一个监听事件表(内核中)
参数:
size:监听事件最大个数
返回值:
成功返回非负值:表示epoll事件表对象(句柄)
失败返回-1
2.2 epoll_ctl
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
功能:
在监听事件表中新增一个事件
参数:
epfd:事件表文件描述符
op:EPOLL_CTL_ADD 新增事件
EPOLL_CTL_MOD 修改事件
EPOLL_CTL_DEL 删除事件
fd:文件描述符
events:事件相关结构体
返回值:
成功返回0
失败返回-1
2.3 epoll_wait
int epoll_wait(int epfd, struct epoll_event *events,
int maxevents, int timeout);
功能:
监听事件表中的事件,并将产生的事件存放到结构体数组中
参数:
epfd:事件表文件描述符
events:存放结果事件结构体数组空间首地址
maxevents:最多存放事件个数
timeout:超时时间
-1:阻塞等待直到有事件发生
返回值:
成功返回产生事件个数
失败返回-1
超时时间到达没有事件发生返回0