epoll

anr 分析(MessageQueue 主线程处于空闲状态) call stack如下: "main" prio=5 tid=1 Native   | group="main" sCount=1 dsCount=0 obj=0x76c35ae8 self=0x7e33296a00   | sysTid=23443 nice=0 cgrp=default sched=0/0 handle=0x7e37875a98   | state=S schedst 阅读详情
 epoll相关的系统调用有:epoll_create, epoll_ctl和epoll_wait。Linux-2.6.19又引入了可以屏蔽指定信号的epoll_wait: epoll_pwait。至此epoll家族已全。其中epoll_create用来创建一个epoll 文件描述符 ,epoll_ctl用来添加/修改/删除需要侦听的文件描述符及其事件,epoll_wait/epoll_pwait接收发生在被侦听的描述符上的,用户感兴趣的IO事件。epoll 文件描述符 用完后,直接用close关闭即可,非常方便。事实上,任何被侦听的文件符只要其被关闭,那么它也会自动从被侦听的 文件描述符 集合中删除,很是智能。
  每次添加/修改/删除被侦听 文件描述符 都需要调用epoll_ctl,所以要尽量少地调用epoll_ctl,防止其所引来的开销抵消其带来的好处。有的时候,应用中可能存在大量的 短连接 (比如说Web服务器),epoll_ctl将被频繁地调用,可能成为这个系统的瓶颈。
  A:IO效率。
  在大家苦苦的为在线人数的增长而导致的 系统资源 吃紧上的问题正在发愁的时候,Linux 2.6 内核 中提供的System Epoll为我们提供了一套完美的解决方案。传统的select以及poll的效率会因为在线人数的线形递增而导致呈二次乃至三次方的下降,这些直接导致了 网络服务器 可以支持的人数有了个比较明显的限制。
  自从Linux提供了/dev/epoll的设备以及后来2.6 内核 中对/dev/epoll设备的访问的封装(System Epoll)之后,这种现象得到了大大的缓解,如果说几个月前,大家还对epoll不熟悉,那么现在来说的话,epoll的应用已经得到了大范围的普及。
  那么究竟如何来使用epoll呢?其实非常简单。
  通过在包含一个头文件#include <sys/epoll.h>以及几个简单的API将可以大大的提高你的 网络服务器 的支持人数。
  首先通过epoll_create(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来保证主循环的效率。
  epoll_wait范围之后应该是一个循环,遍历所有的事件:
  for(n = 0; n < nfds; ++n) {
  if(events[n].data.fd == listener) { //如果是主socket的事件的话,则表示有新连接进入了,进行新连接的处理。
  client = accept(listener, (struct sockaddr *) &local,
  &addrlen);
  if(client < 0){
  perror("accept");
  continue;
  }
  setnonblocking(client); // 将新连接置于非阻塞模式
  ev.events = EPOLLIN | EPOLLET; // 并且将新连接也加入EPOLL的监听队列。
  注意,这里的参数EPOLLIN | EPOLLET并没有设置对写socket的监听,如果有写操作的话,这个时候epoll是不会返回事件的,如果要对写操作也监听的话,应该是EPOLLIN | EPOLLOUT | EPOLLET
  ev.data.fd = client;
  if (epoll_ctl(kdpfd, EPOLL_CTL_ADD, client, &ev) < 0) {
  // 设置好event之后,将这个新的event通过epoll_ctl加入到epoll的监听队列里面,这里用EPOLL_CTL_ADD来加一个新的epoll事件,通过EPOLL_CTL_DEL来减少一个epoll事件,通过EPOLL_CTL_MOD来改变一个事件的监听方式。
  fprintf(stderr, "epoll set insertion error: fd=%d0,
  client);
  return -1;
  }
  }
  else if(event[n].events & EPOLLIN)//如果是已经连接的用户,并且收到数据,那么进行读入
  {
  int sockfd_r;
  if((sockfd_r = event[n].data.fd) < 0)
  continue;
  read(sockfd_r, buffer, MAXSIZE);
  //修改sockfd_r上要处理的事件为EPOLLOUT
  ev.data.fd = sockfd_r;
  ev.events = EPOLLOUT | EPOLLET;
  epoll_ctl(epfd, EPOLL_CTL_MOD, sockfd_r, &ev)
  }
  else if(event[n].events & EPOLLOUT)//如果有数据发送
  {
  int sockfd_w = events[n].data.fd;
  write(sockfd_w, buffer, sizeof(buffer));
  //修改sockfd_w上要处理的事件为EPOLLIN
  ev.data.fd = sockfd_w;
  ev.events = EPOLLIN | EPOLLET;
  epoll_ctl(epfd, EPOLL_CTL_MOD, sockfd_r, &ev)
  }
  do_use_fd(events[n].data.fd);
  }
  对,epoll的操作就这么简单,总共不过4个API:epoll_create, epoll_ctl, epoll_wait和close。
网络编程11——epoll实现多路IO的三个基本函数:epoll_create、epoll_ctl、epoll_wait 要用epoll实现多路IO转接需要用的epoll_create()、epoll_ctl()、epoll_wait()三个函数 一、epoll_create(int size):创建一棵监听红黑树 本质是一棵平衡二叉树(红黑树) 参数size:创建红黑树的监听节点数量(但这个数仅供内核参考 返回值:成功指向新创建的红黑树的根节点fd;失败返回-1和errno 二、epoll_ctrl:操作监听红黑树 参数1:epfd是epoll_create的函数返回值,就是图中的那个根节点 参数2:op 对该监听红黑 阅读详情

相关推荐

YF-S401水流量传感器在STM32上的精准计量实现

本文详细介绍了YF-S401水流量传感器与STM32微控制器的集成应用,实现精准水流计量。通过外部中断和外部时钟两种脉冲计数方案,结合硬件配置、软件滤波和校准技巧,确保高精度流量测量。适用于智能家居和工业自动化中的水控系统,提升系统稳定性和测量准确性。

rainy的博客 896

epoll学习笔记1

简介 epoll是同poll相似的,用于同时监听多个fd上的相关I/O事件。epoll相较于poll而言有边缘触发和水平触发两种事件触发模式,poll只有水平触发一种事件触发模式。 事件触发模式介绍 水平触发 水平触发(Level-Triggered)是当被监控的fd上有可读写事件发生时,epoll_wait会通知程序去读写。如果程序在这次操作没有将数据全部读写完(可能由于缓冲区不够),那么下次调用epoll_wait时仍然会通知程序去读写,直到数据被读写完为止。 优点: 开发时每次读写操作只需要读写想要的

zxc3590235的博客 1057

从Frenet坐标系到多项式拟合:Lattice Planner核心原理拆解与调参指南

本文深入解析了自动驾驶轨迹规划中Lattice Planner的核心原理,重点阐述了其在Frenet坐标系下解耦横纵向规划、利用五次和四次多项式拟合轨迹的数学基础。文章提供了从坐标系转换、采样策略到成本函数设计的完整工程实践指南,并分享了关键的参数调优经验,旨在帮助开发者高效实现稳定、平滑且安全的轨迹规划。

tech5的博客 1111

ANR分析

1. ANR的来源 系统判定一个APP无响应的几个条件包括: 控制Service/Activity/Provider超时、接收广播超时、响应按键/触屏事件超时等。 从系统设计角度来分析,以上这些事件都是给APP主线程发消息,可见这些超时实际都是消息没有在APP的主线程及时处理导致的。 消息没有处理有三种可能: a. 消息没有发送到主线程的消息队列中 b. 主线程还在

xutao20170209的博客 3359

避坑指南:ESP32S3驱动INMP441麦克风时的常见硬件冲突与解决方案

本文详细解析了ESP32S3驱动INMP441麦克风时常见的硬件冲突问题,包括GPIO资源冲突、电源噪声、I2S时钟同步等,并提供了实用的解决方案和优化策略。通过实测数据和代码示例,帮助开发者快速排查和解决音频设备开发中的疑难问题,提升系统稳定性和音频质量。

embedding5hiker的博客 942

国产安全芯片在密码算法国密体系下的性能适配策略

国密体系即国家商用密码体系,是保障信息安全的核心技术体系。自20世纪90年代末起步,国密体系经历了从无到有、从弱到强的发展历程。1999年,国家密码管理局成立,标志着国密体系的正式建立。2000年,国密SM1算法首次发布,开启了国密算法的标准化进程。此后,SM2、SM3、SM4等算法陆续推出,形成了完整的对称与非对称密码算法体系。:2010年,国密标准正式纳入国家标准体系,国密算法在金融、政务、通信等关键领域的应用得到明确规范。

qq_40552871的博客 1355

epoll_pwait

http://man7.org/linux/man-pages/man2/epoll_wait.2.html #include <sys/epoll.h> int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout); ...

a6d0m5i5n1tw的专栏 2782

CVE-2017-7921漏洞深度剖析:从身份验证绕过到实战复现与防御

身份验证是Web应用安全的核心防线,其逻辑缺陷可能导致严重的未授权访问。身份验证绕过漏洞的原理在于,应用程序对特定请求路径或API接口的访问控制策略存在疏漏,未能执行有效的会话或令牌校验。这类漏洞的技术价值在于,攻击者无需凭证即可直接访问受保护的后端资源,从而获取敏感信息或执行未授权操作,对系统机密性、完整性构成直接威胁。在物联网和安防监控领域,大量网络摄像头、录像机等设备暴露于公网,其Web管理界面便成为常见攻击面。本文聚焦于安防设备中一个经典的CVE-2017-7921身份验证绕过漏洞,通过剖析其技术原

WGH100817的博客 469

epoll_pwait系统调用及示例

epoll_pwait是Linux系统调用epoll_wait的扩展版本,支持在等待事件期间设置临时信号掩码。该函数原型包含epoll实例描述符、事件数组、最大事件数、超时时间和信号掩码参数,能够原子性地完成信号掩码设置和事件等待操作,避免传统方式可能出现的竞态条件。相比epoll_wait,epoll_pwait特别适用于需要精确控制信号处理的多线程场景,如服务器主线程需要屏蔽特定信号的情况。示例代码演示了基本使用、信号掩码设置、原子性优势及错误处理等典型应用场景。

悟空看八戒烤熟了没的专栏c)4Upqt4SeVk 434

ER图从入门到精通:数据库建模全攻略

本文为数据库建模领域的 ER 图全面指南,系统解析从基础概念到实战应用的核心要点。首先介绍 ER 图的定义、三大组成元素(实体、属性、关系)及三种基础关系类型(一对一、一对多、多对多);其次详解绘制流程,涵盖工具选择(如 Visio、PowerDesigner)、需求分析方法及实体 - 属性 - 关系的分步建模技巧;进一步探讨弱实体、复合属性等高级概念,结合范式理论讲解模型优化策略;针对实体属性混淆、关系类型误判等常见问题提供解决方案;最后通过电商系统、图书馆管理系统等实际案例展示 ER 图设计全流程。

邓邓子的博客 4213

Node-RED教程(二):Node-RED的面板的操作

Node-RED系列(二):Node-RED的面板的操作 要使用Node-RED去搭建一个物联网平台,链接设备,设备通信,就必须要先熟悉Node-RED的这种面板,对于一个新的项目,在动手做之前一点想对这个的技术的文档有足够的了解做起来才能游刃有余。本期我给大家介绍一下Node-RED的各种面板,熟悉这些面板后,在后续的搭建Iot服务中,会举重若轻,同时该系列的文档,难度会逐步加深,知道了本章解释的名称后对后续文章的理解有很大帮助。 面板1:默认节点选项列表 安装Node-RED后默认的节点分为这5大类

知无涯 1万+

epoll原理分析,图文并茂讲解epoll,彻底弄懂epoll机制

epoll是网络编程中非常难的一点,通过本文学习能彻底了解epoll原理,初学者少走弯路

weixin_28673511的博客 8970

25 - GRACE Mascon数据缺失月份数据插值

本篇基于文章的相关内容和文章公开的奇异谱分析(SSA)插值算法程序包,对grace Mascon数据种缺失的月份进行 插值 ,总结了使用程序包的相关过程,可以将该程序应用到其他数据处理插值计算中。

weixin_43339605的博客 1842

epoll介绍及原理详解

1. epoll原理与函数介绍 四个重要的函数 epoll_create(); epoll_ctl(); epoll_wait(); epoll_event_callback(); 1.1 epoll_create()函数 int epoll_create(int size); 创建一个epoll对象,返回该对象的描述符(文件描述符),这个描述符就代表这个epoll对象,后续会用到; 这个epoll对象最终是要close()的,因为文件描述符始终是要关闭的!size>0; 原理: struct

weixin_46258483的博客 9932

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

epoll学习:epoll_ctl函数详解

epoll_ctl函数:向文件描述符epfd引用的epoll实例执行控制操作(op:添加、修改或者删除)。

个人工作中学到的专业技术与职业发展知识笔记 9589

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

epoll使用详解:epoll_create、epoll_ctl、epoll_wait、close

epoll - I/O event notification facility 在linux的网络编程中,很长的时间都在使用select来做事件触发。在linux新的内核中,有了一种替换它的机制,就是epoll。 相比于select,epoll最大的好处在于它不会随着监听fd数目的增长而降低效率。因为在内核中的select实现中,它是采用轮询来处理的,轮询的fd数目越多,自然耗时越多。并且,在linux/posix_types.h头文件有这样的声明: #define __FD_SETSIZE 1024...

jfcat的专栏 3095

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

epoll详解【epoll_create】【epoll_ctl】【epoll_wait】

文章目录0 - 前言1 - epoll接口epoll_createepoll_ctlepoll_wait 0 - 前言 参考:epoll机制:epoll_create、epoll_ctl、epoll_wait、close 1 - epoll接口 epoll_create #include <sys / epoll.h> nfd = epoll_creat(max_size); 创建一个内核事件表 (也叫epoll句柄),nfd为epoll句柄(不了解句柄看下一段),参数max_size

日月既往,不可复追 2225

epoll使用详解 epoll_create epoll_ctl epoll_wait close

文章目录前言一、epoll接口1 int epoll_create(int size)2 int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event)3 int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout)二、工作模式关于ET、LT两种工作模式ET模式与LT模式的区别在于三 使用epoll四 完整示例 前言 在linux网络编

goosse的博客 2044

epoll使用详解

在linux的网络编程中,很长的时间都在使用select来做事件触发。在linux新的内核中,有了一种替换它的机制,就是epoll。 相比于select,epoll最大的好处在于它不会随着监听fd数目的增长而降低效率。因为在内核中的select实现中,它是采用轮询来处理的,轮询的fd数目越多,自然耗时越多。并且,在linux/posix_types.h头文件有这样的声明: #define __FD_SETSIZE 1024 表示select最多同时监听1024个fd,当然,可以通过修改头文件再重编译内...

k916631305的博客 3570

epoll详解

在linux 没有实现epoll事件驱动机制之前,我们一般选择用select或者poll等IO多路复用的方法来实现并发服务程序。自Linux 2.6内核正式引入epoll以来,epoll已经成为了目前实现高性能网络服务器的必备技术,在大数据、高并发、集群等一些名词唱得火热之年代,select和poll的用武之地越来越有限,风头已经被epoll占尽。 那究竟什么是epoll呢?epoll 是 Linux 内核的可扩展 I/O 事件通知机制,其最大的特点就是性能优异。...

Ineffable__的博客 4445

epoll事件

在epoll中,主要涉及到3个函数:epoll_create()、epoll_ctl()以及epoll_wait(),详细内容如下:(《节选自Linux高性能服务器编程》) 其中,epoll_event的事件如下: –EPOLLIN,读事件 –EPOLLOUT,写事件 –EPOLLPRI,带外数据,与select的异常事件集合对应 –EPOLL...

ZGT的博客 4903

C++中epoll用法总结

epoll能显著的提高程序的CPU利用率。本文中代码是源码中healthd中的ueventfd的epoll监听代码。

weixin_41028555的博客 2378

epoll_create, epoll_ctl和epoll_wait 实例讲解

epoll_create, epoll_ctl和epoll_wait 实例讲解 Admin 2012年2月2日名人名言:人必须像天上的星星,永远很清楚地看出一切希望和愿望的火光,在地上永远不熄地燃烧着火光。——高尔基 NAME        epoll - I/O event notification facility SYNOPSIS        #includ

小忒的学习与生活 3万+

epoll_create, epoll_ctl和epoll_wait

名词解释:man epoll之后,得到如下结果:  NAME         epoll - I/O event notification facility  SYNOPSIS         #include   DEscrīptION

3万+

epoll用到的epoll_create,epoll_ctl, epoll_wait三个函数,以及epoll的工作模式

1、epoll_create函数 函数声明:int epoll_create(int size) 该 函数生成一个epoll专用的文件描述符。它其实是在内核申请一空间,用来存放你想关注的socket fd上是否发生以及发生了什么事件。size就是你在这个epoll fd上能关注的最大socket fd数。 2、epoll_ctl函数 函数声明:int epoll_ctl(in...

qq_23114283的博客 3490
上一篇: 我们从未逃离北上广
下一篇: timerfd
_小青年儿_
博客等级 码龄16年 155粉丝 283原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值