epoll 是 Linux 内核为处理大批量文件描述符而作了改进的 poll,是 Linux 下多路复用 IO接口 select/poll 的增强版本
在 linux 的网络编程中,很长时间都在使用 select 来做事件触发。在 2.6 内核中,有一种替换它的机制,就是 epoll。
select 与 epoll 区别概述
、函数使用上:epoll 使用一组函数来完成任务,而不是单个函数
、效率:select 使用轮询来处理,随着监听 fd 数目的增加而降低效率。
而 epoll 把用户关心的文件描述符事件放在内核里的一个事件表中,只需要一个额外的文件描述符来标识内核中的这个事件表即可。
/*
函数名 :int epoll_create(int size);
参 数 :int size -- 监听的数目
返回值 :int fd -- 一个额外的文件描述符, 来标识内核事件表
说 明 :创建一个epoll的句柄,size用来告诉内核这个监听的数目一共有多大
*/
int epoll_create(int size);
/*
函数名 :epoll_ctl
参 数 :int epfd -- 要操作的内核事件表的文件描述符,即epoll_create 的返回值
参 数 :int op -- 指定操作类型,操作类型有三种:
->EPOLL_CTL_ADD:往内核事件表中注册指定fd 相关的事件
->EPOLL_CTL_MOD:修改指定 fd 上的注册事件
->EPOLL_CTL_DEL:删除指定 fd 的注册事件
参 数 :int fd -- 要操作的文件描述符,也就是要内核事件表中监听的fd
参 数 :struct epoll_event -- 要监听的事件类型,epoll_event 结构指针类型。
返回值 :int ret -- 成功时返回 0,失败则返回 -1,并设置 errno
说 明 :epoll 的事件注册函数,用来操作内核事件表
*/
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
typedef union epoll_data {
void *ptr;
int fd;
__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 events 对应的宏:
EPOLLIN: 表示对应的文件描述符可以读(包括对端SOCKET正常关闭);
EPOLLOUT: 表示对应的文件描述符可以写;
EPOLLPRI: 表示对应的文件描述符有紧急的数据可读(这里应该表示有带外数据到来);
EPOLLERR: 表示对应的文件描述符发生错误;
EPOLLHUP: 表示对应的文件描述符被挂断;
EPOLLET: 将EPOLL设为边缘触发(Edge Triggered)模式,这是相对于水平触发(Level Triggered)来说的。
EPOLLONESHOT:只监听一次事件,当监听完这次事件之后,如果还需要继续监听这个socket的话,需要再次把这个socket加入到EPOLL队列里
/*
函数名 :epoll_wait;
参 数 :int epfd -- epoll_create 的返回值
参 数 :struct epoll_event* -- 内核事件表中得到的检测事件集合
参 数 :int maxevents -- 最大size
参 数 :int timeout -- 超时时间
返回值 :int ret -- 成功时返回就绪的文件描述符的个数,失败返回 -1 并设置 errno
说 明 :等待事件的发生,它在一段超时时间之内等待一组文件描述符上的事件,epoll_wait 函数如果检测到事件,
就将所有就绪的事件从内核事件表(epfd 参数决定)中复制到第二个参数 events 指向的数组中。
*/
int epoll_wait(int epfd, struct epoll_event* events, int maxevents, int timeout);
epoll 工作模式
LT(level trigger) 模式是默认模式
  LT模式:电平触发,当 epoll_wait 检测到描述符事件发生并将此事件通知应用程序,应用程序可以不立即处理该事件。
下次调用 epoll_wait 时,会再次响应应用程序并通知此事件。
ET(edge trigger)
边沿触发:当 epoll_wait 检测到描述符事件发生并将此事件通知应用程序,应用程序必须立即处理该事件。
如果不处理,下次调用 epoll_wait 时,不会再次响应应用程序并通知此事件。
  ET 模式在很大程度上减少了 epoll 事件被重复触发的次数,因此效率要比 LT 模式高。
epoll 工作在 ET 模式的时候,必须使用非阻塞套接口,以避免由于一个文件句柄的阻塞读/阻塞写操作把处理多个文件描述符的任务饿死。

最新文章

  1. 用border-image实现波浪边框
  2. 使用 python 实现 wc 命令程序的基本功能
  3. js执行环境的深入理解
  4. C++读取文件夹中所有的文件或者是特定后缀的文件
  5. 【BZOJ】【3676】【APIO2014】回文串
  6. 微软提供了三个核心服务:Windows+Office 365+Azure
  7. UAC下的程序权限提升
  8. xadmin 数据添加报错: IndexError: list index out of range
  9. Java实现AES加密
  10. codeforces 493 div1 e
  11. puppeteer实现线上服务器任意区域截图
  12. vue中使用axios
  13. rabbitmq基础学习+springboot结合rabbitmq实现回调确认confirm
  14. [NOIP2012提高]借教室 题解(二分答案+差分)
  15. 软件安装的list(0918)
  16. SQLite 日期 & 时间
  17. Android之与当前连接的wifi进行文件夹的浏览与传输
  18. hadoop分布式安装及其集群配置笔记
  19. javascript代码在线测试
  20. 使用powershell 执行脚本,windows默认不允许任何脚本运行

热门文章

  1. Mybatis多数据源读写分离(注解实现)
  2. Laravel 从入门到精通 创建并运行一个新的 Laravel 项目
  3. Docker 01 - CentOS 7 中安装 Docker 的详细步骤
  4. Selenium+python上传本地文件或者图片
  5. 第八届蓝桥杯java b组第六题
  6. 使用 Docker 让部署 Django 项目更加轻松
  7. C++set 和 multiset的使用
  8. Android Studio 优秀插件:GsonFormat
  9. 队列 & 栈---概述
  10. 即学即用的 30 段 Python 实用代码