首页 > 代码库 > epoll学习
epoll学习
1、概述:与select和poll类似,epoll也是异步网络通信模型,但运行效率更高。
2、epoll接口:
2.1 int epoll_create(int size);
epoll_create创建一个cpoll实例,并返回该实例的文件描述符fd,当停止使用epoll时,需要close这个fd。
参数:size,表示该epoll最多监听的fd数量。epoll实际处理中并不关注这个size,也就是说epoll理论上是没有监听数量上限的,只要size大于0即可。
2.2 int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
epoll_ctl用于向先前通过epoll_create创建的epoll实例中操作fd。
参数1:epfd,由epoll_create创建的epoll的fd。
参数2:op,具体操作,有三个值:EPOLL_CTL_ADD(向epoll中添加fd)、EPOLL_CTL_MOD(修改epoll中已添加fd所关注的事件)和EPOLL_CTL_DEL(删除epoll中的fd)。
参数3:fd,待处理的fd。
参数4:参数3的fd所关注的事件。若操作为EPOLL_CTL_DEL,则不需要携带参数4.
The event argument describes the object linked to the file descriptor fd. The struct epoll_event is defined as:
typedef union epoll_data {
void *ptr;
int fd; //对应于参数3
uint32_t u32;
uint64_t u64;
} epoll_data_t;
struct epoll_event {
uint32_t events; /* Epoll events */
epoll_data_t data; /* User data variable */
};
epoll事件包括:EPOLLIN(fd可读)、EPOLLOUT(fd可写)、EPOLLERR(fd异常)、EPOLLET(边沿触发)等。
2.3、int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);
通过epoll_wait来批量获取有状态变化的fd,返回值为fd的数量。
参数1:epfd,由epoll_create创建。
参数2:events是一个数组,应用程序通过events从内核获取有事件发生的fd的信息,通过events[i].events来与EPOLLIN等进行与操作来判断fd发生了什么事件。
参数3:maxevents与参数2相对应,表示events这个数组的数量,一般不用太大。
参数4:epoll_wait阻塞时间。timeout为0,则epoll在判断epoll的fd就绪队列便立即返回。timeout大于0,那么epoll中会阻塞相应时间才返回。timeout小于0,则
epoll将无限阻塞下去,直到有事件发生才退出。根据实际需求来设置timeout的数值,设置任意值均可。
3、实例:参考 Linux Programmer‘s Manual中对epoll 的介绍及使用方法,epoll的使用模型大多相似,根据实际业务需求进行适配即可。
epoll学习