
全部展开
epoll是一个事件驱动的库,与上面的poll和select不同. 它是在Linux 2.5.44中引入的,属于poll的一种变体. 上面的轮询和选择库,它们最大的问题是效率. 他们的处理方法是创建一个事件列表,然后将该列表发送到内核,然后返回轮询以检查此列表,从而在应用更多描述符时,效率相对较低. 更好的做法是将描述符列表移交给内核. 一旦事件发生,内核将事件的描述符列表通知进程,这避免了轮询整个描述符列表. epoll就是这样一个模型. 下面介绍epoll的用法:
(1). 创建一个epoll描述符,调用epoll_create()完成,epoll_create()具有一个整数参数大小,用于告诉内核使用大小描述符创建事件列表(集合)

int epoll_create(整数大小)
(2). 将感兴趣的事件设置为描述符,并将其添加到内核的事件列表中. 在这里,您需要调用epoll_ctl()来完成.
int epoll_ctl(int epfd,int op,int fd,struct epoll_event *事件)

这里有三种op参数,代表三种操作:
a. EPOLL_CTL_ADD,将要关注的描述符和有关事件的结构添加到内核事件列表中
b. EPOLL_CTL_DEL,从内核事件列表中删除先前添加的描述符和与之相关的事件的结构

c. EPOLL_CTL_MOD,将感兴趣的事件修改为先前添加到内核事件列表中的描述符
(3). 等待内核通知事件以获取事件描述符结构的列表. 此过程由epoll_wait()完成. 获取事件列表后epoll事件模型,您可以继续进行事件处理.
int epoll_wait(int epfdepoll事件模型,struct epoll_event *事件,int maxevents,int超时)

使用epoll时,需要特别注意一件事,即epoll触发事件文件有两种方式:
(1)边沿触发(ET),在这种情况下,事件由到达边界的数据触发. 因此,在处理读写时,必须连续调用读写,直到它们返回EAGAIN,然后转到epoll_wait()以等待下一个事件. 此方法的应用应遵循以下原则:
a. 使用非阻塞I / O; b. 在读/写返回EAGAIN之前,不要等待下一个事件.
(2)级别触发(LT),在这种情况下,epoll和poll相似,但是处理速度可能比poll快. 在这种情况下,只要存在尚未读取或写入的数据,当调用epoll_wait()时,就会触发一个事件.
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-163152-1.html
往往都会导致行业混乱不堪
很难