一、 epoll函数集

  epoll主要有三个函数:

  1. int epoll_create(int size);

  创建一个epoll的句柄,size用来告诉内核这个监听的数目一共有多大。这个参数不同于select()中的第一个参数,给出最大监听的fd+1的值。需要注意的是,当创建好epoll句柄后,它就是会占用一个fd值,在linux下如果查看/proc/进程id/fd/,是能够看到这个fd的,所以在使用完epoll后,必须调用close()关闭,否则可能导致fd被耗尽。

  2. int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);

  epoll的事件注册函数

  第一个参数是epoll_create()的返回值

  第二个参数表示动作,用三个宏来表示:
    EPOLL_CTL_ADD:注册新的fd到epfd中;
    EPOLL_CTL_MOD:修改已经注册的fd的监听事件;
    EPOLL_CTL_DEL:从epfd中删除一个fd;
  第三个参数是需要监听的fd

  第四个参数是告诉内核需要监听什么事,struct epoll_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 */
};

  events可以是以下几个宏的集合:
  EPOLLIN :表示对应的文件描述符可以读(包括对端SOCKET正常关闭);
  EPOLLOUT:表示对应的文件描述符可以写;
  EPOLLPRI:表示对应的文件描述符有紧急的数据可读(这里应该表示有带外数据到来);
  EPOLLERR:表示对应的文件描述符发生错误;
  EPOLLHUP:表示对应的文件描述符被挂断;
  EPOLLET: 将EPOLL设为边缘触发(Edge Triggered)模式,这是相对于水平触发(Level Triggered)来说的。
  EPOLLONESHOT:只监听一次事件,当监听完这次事件之后,如果还需要继续监听这个socket的话,需要再次把这个socket加入到EPOLL队列里

  3. int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);
  等待事件的产生,类似于select()调用。参数events用来接收从内核得到事件的集合,maxevents告之内核这个events有多大,这个 maxevents的值不能大于创建epoll_create()时的size,参数timeout是超时时间(毫秒,0会立即返回,-1永久阻塞)。该函数返回需要处理的事件数目,如返回0表示已超时。

二、 epoll使用

  首先通过create_epoll(int maxfds)来创建一个epoll的句柄,其中maxfds为你epoll所支持的最大句柄数。这个函数会返回一个新的epoll句柄,之后的所有操作将通过这个句柄来进行操作。在用完之后,记得用close()来关闭这个创建出来的epoll句柄。

之后在网络主循环里面,每一帧的调用epoll_wait(int epfd, epoll_event events, int max events, int timeout)来查询所有的网络接口,看哪一个可以读,哪一个可以写了。基本的语法为:

nfds = epoll_wait(kdpfd, events, maxevents, -1);

  其中kdpfd为用epoll_create创建之后的句柄,events是一个epoll_event*的指针,当epoll_wait这个函数操作成功之后,epoll_events里面将储存所有的读写事件。max_events是当前需要监听的所有socket句柄数。最后一个timeout是 epoll_wait的超时,为0的时候表示马上返回,为-1的时候表示一直等下去,直到有事件范围,为任意正整数的时候表示等这么长的时间,如果一直没有事件,则范围。一般如果网络主循环是单独的线程的话,可以用-1来等,这样可以保证一些效率,如果是和主逻辑在同一个线程的话,则可以用0来保证主循环的效率。

三、实例

明日补...

Linux epoll相关推荐

  1. linux epoll监听套接字实例

    linux epoll机制用于IO多路复用,能够同时监听多个接字,使用起来比较简单. 相关接口: #include <sys/epoll.h>int epoll_create(int si ...

  2. 劫起|再谈Linux epoll惊群问题的原因和解决方案

    原作者:dog250,授权发布 重新整理: 极客重生 文章有点长,可以三连收藏慢慢看 缘起 近期排查了一个问题,epoll惊群的问题,起初我并不认为这是惊群导致,因为从现象上看,只是体现了CPU不均衡 ...

  3. linux epoll 开发指南-【ffrpc源码解析】

    linux epoll 开发指南-[ffrpc源码解析] 摘要 关于epoll的问题很早就像写文章讲讲自己的看法,但是由于ffrpc一直没有完工,所以也就拖下来了.Epoll主要在服务器编程中使用,本 ...

  4. Linux epoll的用法

    Linux epoll的用法 epollfd_create函数 #include <sys/epoll.h>int epoll_create (int __size) 参数 含义 __si ...

  5. python网络编程linux pdf_Python网络编程:Linux epoll

    原文地址:http://scotdoyle.com/python-epoll-howto.html 介绍 Python已于2.6版本添加访问Linux epoll库的API.这篇教程使用Python ...

  6. [转] Windows完成端口与Linux epoll技术简介

    Windows完成端口与Linux epoll技术简介 2008-01-03 16:18 WINDOWS完成端口编程1.基本概念 2.WINDOWS完成端口的特点 3.完成端口(Completion ...

  7. 再谈Linux epoll惊群问题的原因和解决方案

    差别是什么?差别只是西装! 缘起 近期排查了一个问题,epoll惊群的问题,起初我并不认为这是惊群导致,因为从现象上看,只是体现了CPU不均衡.一共fork了20个Server进程,在请求负载中等的时 ...

  8. 基于linux epoll网络编程细节处理丨epoll原理剖析

    epoll原理剖析以及三握四挥的处理 1. epoll原理详解 2. 连接的创建与断开 3. epoll如何连接细节问题 视频讲解如下,点击观看: 基于linux epoll网络编程细节处理丨epol ...

  9. linux epoll机制

    在linux 没有实现epoll事件驱动机制之前,我们一般选择用select或者poll等IO多路复用的方法来实现并发服务程序.在linux新的内核中,有了一种替换它的机制,就是epoll. sele ...

  10. Windows完成端口与Linux epoll技术简介

    WINDOWS完成端口编程 1 1.基本概念 1 2.WINDOWS完成端口的特点 2 3.完成端口(Completion Ports )相关数据结构和创建 2 4.完成端口线程的工作原理 4 5.W ...

最新文章

  1. Java日期时间使用总结
  2. java Export Excel POI 转
  3. matlab均值量化函数_在matlab中理解抽样量化的概念:均匀量化的实现
  4. ExtendTableView
  5. 2014Esri国际用户大会ArcGIS Online
  6. 编码练习——Java-6-类的高级特性
  7. python负数取余 整除运算
  8. ffmpeg avformat_open_input返回失败的解决办法
  9. 怎么得到hid设备名_上海海关旧设备进口清关公司这个不错
  10. java取整和四舍五入方法
  11. JSK-382 元音字母复制【入门】
  12. 在infoWindow中显示Geocode server(地理编码服务)
  13. [转]mysql慢查询日志
  14. spring5.0学习笔记9
  15. STM32CAN波特率简易计算
  16. 女生学计算机和遥感哪个好就业,遥感科学与技术有性别歧视吗知乎
  17. SLA服务可用性4个9是什么意思?如何保证服务的高可用性 HA(High Availability)?...
  18. 【坦白说】如何确定对方身份?
  19. GBase 8s 编写使用UDR(C/Java)
  20. JQuery监听页面滚动总结

热门文章

  1. 希尔排序 - 数据结构和算法91
  2. DataTable ,XML和JSON相互转化
  3. WebLogic 数据源密码加密
  4. CoverageMeter中关于“line coverage”不准确的解释
  5. Exchange 2016 證書無效如何處理?
  6. css案例学习之全局声明*{} 与body{}的区别
  7. SSL/TLS算法流程解析
  8. jsp 中的js 与 jstl 运行的先后顺序
  9. 如何解决XML文件中的警告提示“No grammar constraints (DTD or XML Schema) referenced in the document.”...
  10. 大型网站架构系列:电商网站架构案例(2)