第一次认识epoll机制是在Android中的Handler中的Looper的唤醒和休眠机制,后者是利用Linux提供的epoll完成的。
epoll是Linux独有的机制,属于高并发下的事件驱动,是对于select和poll的性能提升。
//头文件
#include <sys/epoll>
//api
//表示创建一个epoll句柄
int epoll_create(int _size)
//对上述创建的epoll句柄进行操作
int epoll_ctl(int __epoll_fd, int __op, int __fd, struct epoll_event* __event);
//等待处于epoll上被监听的fd产生对应的事件
int epoll_wait(int __epoll_fd, struct epoll_event* __events, int __event_count, int __timeout_ms);
- epoll_ctl
- __epoll_fd:epoll句柄,可以认为被监听的fd是挂在这个句柄上的
- __op:本次的操作
- EPOLL_CTL_ADD:向epoll句柄注册一个fd
- EPOLL_CTL_MOD:向epoll句柄修改一个已经注册的fd
- EPOLL_CTL_DEL:删除一个已经注册在epoll句柄中的fd
- __fd:被监听的文件描述符
- __event:被监听的事件
- EPOLLIN:表示被监听的fd有可以读的数据
- EPOLLOUT:表示被监听的fd有可以写的数据
- EPOLLPRI:表示有可读的紧急数据
- EPOLLERR:对应的fd发生异常
- EPOLLHUP:对应的fd被挂断
- EPOLLET:设置EPOLL为边缘触发
- EPOLLONESHOT:只监听一次
//以下是linux-4.12下的源码
//./include/uapi/linux/eventpoll.h
struct epoll_event {
__u32 events;
__u64 data;
} EPOLL_PACKED
- epoll_wait
- __epoll_fd:epoll句柄
- epoll_event:回传处理事件的数组
- __event_count:每次能处理的事件数
- __timeout_ms:等待IO,-1表示一直阻塞直到来IO被唤醒,大于0表示阻塞指定的时间后被唤醒。
网友评论