当前位置: 首页 > news >正文

理解Epoll

epoll是Linux特有的I/O复用的一组函数,其实现与select和poll有很大的差异。

  1. epoll使用函数组,而不是单个函数;
  2. epoll将用户关心的文件描述符对应的事件放在内核中的事件列表中;
           #define MAX_EVENTS 10
           struct epoll_event ev, events[MAX_EVENTS];
           int listen_sock, conn_sock, nfds, epollfd;

           /* Code to set up listening socket, 'listen_sock',
              (socket(), bind(), listen()) omitted */

           epollfd = epoll_create1(0);
           if (epollfd == -1) {
               perror("epoll_create1");
               exit(EXIT_FAILURE);
           }

           ev.events = EPOLLIN;
           ev.data.fd = listen_sock;
           if (epoll_ctl(epollfd, EPOLL_CTL_ADD, listen_sock, &ev) == -1) {
               perror("epoll_ctl: listen_sock");
               exit(EXIT_FAILURE);
           }

           for (;;) {
               nfds = epoll_wait(epollfd, events, MAX_EVENTS, -1);
               if (nfds == -1) {
                   perror("epoll_wait");
                   exit(EXIT_FAILURE);
               }

               for (n = 0; n < nfds; ++n) {
                   if (events[n].data.fd == listen_sock) {
                       conn_sock = accept(listen_sock,
                                       (struct sockaddr *) &local, &addrlen);
                       if (conn_sock == -1) {
                           perror("accept");
                           exit(EXIT_FAILURE);
                       }
                       setnonblocking(conn_sock);
                       ev.events = EPOLLIN | EPOLLET;
                       ev.data.fd = conn_sock;
                       if (epoll_ctl(epollfd, EPOLL_CTL_ADD, conn_sock,
                                   &ev) == -1) {
                           perror("epoll_ctl: conn_sock");
                           exit(EXIT_FAILURE);
                       }
                   } else {
                       do_use_fd(events[n].data.fd);
                   }
               }
           }

【参考】

1.https://segmentfault.com/a/1190000003063859

相关文章:

  • 虚拟机ubantu18.04与Windows7共享文件夹(samba)
  • win10 “你不能访问此共享文件夹,因为你组织的安全策略阻止未经身份验证的来宾访问。”
  • 安装lua报错:fatal error: readline/readline.h: No such file or directory
  • 【重学Linux系列(一)之一一Linux命令】
  • C盘突然满了,找了好几天。。。
  • ubantu18.04server配置IP
  • int与CString互转
  • error LNK2019: unresolved external symbol
  • 对话框在DLL中DoModal()返回-1?
  • Linux系统网络I/O模型
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • error LNK2001: unresolved external symbol __declspec(dllimport) const XXXX::`vftable'
  • 高性能服务端开发知识点
  • 单文档让默认的菜单栏不显示
  • 【重学Linux系列(二)之一一Linux内核更换】
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • canvas 五子棋游戏
  • CentOS从零开始部署Nodejs项目
  • codis proxy处理流程
  • co模块的前端实现
  • ES6 学习笔记(一)let,const和解构赋值
  • FastReport在线报表设计器工作原理
  • java小心机(3)| 浅析finalize()
  • JSONP原理
  • python大佬养成计划----difflib模块
  • Transformer-XL: Unleashing the Potential of Attention Models
  • webpack+react项目初体验——记录我的webpack环境配置
  • 阿里研究院入选中国企业智库系统影响力榜
  • 大数据与云计算学习:数据分析(二)
  • 力扣(LeetCode)965
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • Java数据解析之JSON
  • 第二十章:异步和文件I/O.(二十三)
  • ​​​​​​​​​​​​​​Γ函数
  • # 计算机视觉入门
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (175)FPGA门控时钟技术
  • (20050108)又读《平凡的世界》
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (3)(3.5) 遥测无线电区域条例
  • (floyd+补集) poj 3275
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (新)网络工程师考点串讲与真题详解
  • (学习日记)2024.01.19
  • (一)80c52学习之旅-起始篇
  • (转)大道至简,职场上做人做事做管理
  • .bat批处理(十一):替换字符串中包含百分号%的子串
  • .mat 文件的加载与创建 矩阵变图像? ∈ Matlab 使用笔记
  • .NET : 在VS2008中计算代码度量值
  • .net core 调用c dll_用C++生成一个简单的DLL文件VS2008
  • .NET MVC第五章、模型绑定获取表单数据
  • .NET Remoting Basic(10)-创建不同宿主的客户端与服务器端
  • .NET Standard 支持的 .NET Framework 和 .NET Core
  • .NET 回调、接口回调、 委托
  • .net 简单实现MD5