epoll学习

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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学习的主要内容,如果未能解决你的问题,请参考以下文章

epoll多路复用机制的学习

epoll学习

epoll学习随笔

IO多路复用--epoll(待学习)

redis学习-NIO和EPOLL

Linux学习笔记-epoll