彻底学会使用epoll(四)——ET的写操作实例分析

epoll LT/ET 深入剖析 LT的编程与poll/select接近,符合一直以来的习惯,不易出错 ET的编程可以做到更加简洁,某些场景下更加高效,但另一方面容易遗漏事件,容易产生bug 阅读详情

首先,看程序四的例子。

l 程序四


点击(此处)折叠或打开

  1. #include <unistd.h>
  2. #include <iostream>
  3. #include <sys/epoll.h>
  4. using namespace std;
  5. int main(void)
  6. {
  7.     int epfd,nfds;
  8.     struct epoll_event ev,events[5];//ev用于注册事件,数组用于返回要处理的事件
  9.     epfd=epoll_create(1);//只需要监听一个描述符——标准输出
  10.     ev.data.fd=STDOUT_FILENO;
  11.     ev.events=EPOLLOUT|EPOLLET;//监听读状态同时设置ET模式
  12.     epoll_ctl(epfd,EPOLL_CTL_ADD,STDOUT_FILENO,&ev);//注册epoll事件
  13.     for(;;)
  14.    {
  15.       nfds=epoll_wait(epfd,events,5,-1);
  16.       for(int i=0;i<nfds;i++)
  17.      {
  18.          if(events[i].data.fd==STDOUT_FILENO)
  19.              cout<<"hello world!"<<endl;
  20.      }
  21.    }
  22. };

这个程序的功能是只要标准输出写就绪,就输出“hello world!”。

运行结果:

我们发现这将是一个死循环。下面具体分析一下这个程序的执行过程:

(1) 首先初始buffer为空,buffer中有空间可写,这时无论是ET还是LT都会将对应的epitem加入rdlist(对应第一节图中的红线),导致epoll_wait就返回写就绪。

(2) 程序想标准输出输出”hello world!”和换行符,因为标准输出为控制台的时候缓冲是“行缓冲”,所以换行符导致buffer中的内容清空,这就对应第二节中ET模式下写就绪的第二种情况——当有旧数据被发送走时,即buffer中待写的内容变少得时候会触发fd状态的改变。所以下次epoll_wait会返回写就绪。之后重复这个过程一直循环下去。

我们再看程序五。

l 程序五

相对程序四这里仅仅去掉了输出的换行操作。即:

 cout<<"hello world!";

运行结果如下:

我们看到程序成挂起状态。因为第一次epoll_wait返回写就绪后,程序向标准输出的buffer中写入“hello world!”,但是因为没有输出换行,所以buffer中的内容一直存在,下次epoll_wait的时候,虽然有写空间但是ET模式下不再返回写就绪。回忆第一节关于ET的实现,这种情况原因就是第一次buffer为空,导致epitem加入rdlist,返回一次就绪后移除此epitem,之后虽然buffer仍然可写,但是由于对应epitem已经不再rdlist中,就不会对其就绪fd的events的在检测了。

l 程序六


点击(此处)折叠或打开

  1. int main(void)
  2. {
  3.     int epfd,nfds;
  4.     struct epoll_event ev,events[5];//ev用于注册事件,数组用于返回要处理的事件
  5.     epfd=epoll_create(1);//只需要监听一个描述符——标准输出
  6.     ev.data.fd=STDOUT_FILENO;
  7.     ev.events=EPOLLOUT;//使用默认LT模式
  8.     epoll_ctl(epfd,EPOLL_CTL_ADD,STDOUT_FILENO,&ev);//注册epoll事件
  9.     for(;;)
  10.    {
  11.      nfds=epoll_wait(epfd,events,5,-1);
  12.      for(int i=0;i<nfds;i++)
  13.     {
  14.       if(events[i].data.fd==STDOUT_FILENO)
  15.          cout<<"hello world!";
  16.     }
  17.    }
  18. };

程序六相对程序五仅仅是修改ET模式为默认的LT模式,我们发现程序再次死循环。这时候原因已经很清楚了,因为当向buffer写入”hello world!”后,虽然buffer没有输出清空,但是LT模式下只有buffer有写空间就返回写就绪,所以会一直输出”hello world!”,当buffer满的时候,buffer会自动刷清输出,同样会造成epoll_wait返回写就绪。

l 程序七

点击(此处)折叠或打开

  1. int main(void)
  2. {
  3.     int epfd,nfds;
  4.     struct epoll_event ev,events[5];//ev用于注册事件,数组用于返回要处理的事件
  5.     epfd=epoll_create(1);//只需要监听一个描述符——标准输出
  6.     ev.data.fd=STDOUT_FILENO;
  7.     ev.events=EPOLLOUT|EPOLLET;//监听读状态同时设置ET模式
  8.     epoll_ctl(epfd,EPOLL_CTL_ADD,STDOUT_FILENO,&ev);//注册epoll事件
  9.     for(;;)
  10.    {
  11.      nfds=epoll_wait(epfd,events,5,-1);
  12.      for(int i=0;i<nfds;i++)
  13.     {
  14.        if(events[i].data.fd==STDOUT_FILENO)
  15.            cout<<"hello world!";
  16.        ev.data.fd=STDOUT_FILENO; 
  17.        ev.events=EPOLLOUT|EPOLLET; 
  18.        epoll_ctl(epfd,EPOLL_CTL_MOD,STDOUT_FILENO,&ev); //重新MOD事件(ADD无效)
  19.    }
  20.  }
  21. };

程序七相对于程序五在每次向标准输出的buffer输出”hello world!”后,重新MOD OUT事件。所以相当于每次重新进行第一节中红线描述的途径返回就绪,导致程序循环输出。

转载:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=28541347&id=4296180http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=28541347&id=4296180

基于libcurl 的http异步请求 最近工作关系,需要一个c++实现的异步http请求功能,在网上查了些质料,最后决定用libcurl。不过libcurl编译起来比较困难,研究了很长时间才弄明白。这个小程序只是简单的使用线程池实现了libcurl的异步请求功能,很多地方还需要优化,之所有厚颜上传到这里,主要有有三个目的。 一个是回报这些天在优快云上得到的帮助,希望可以帮助到后来的人; 二是感于libcurl编译实在繁琐,如果有需要这个库又一时编译不通过的人,可以直接拿程序中的libcurl库文件用; 三是希望得到优快云上大神们的指点。 如果要使用这个程序所设计的异步http请求功能,可以继承 HttpBaseRequest 类,重写virtual void OnComplete(CURLcode code);方法来处理应答消息。 如果有其他与本程序相关的问题 立即下载

相关推荐

Sony SLVS-EC接口实战:如何用Xilinx K7 FPGA接收IMX421传感器数据(附电气特性匹配技巧)

本文详细介绍了在Xilinx Kintex-7 FPGA平台上实现Sony IMX421图像传感器SLVS-EC接口数据接收的完整实战方案。内容涵盖从硬件选型、PCB布局的电气特性匹配技巧,到FPGA内部GTX收发器配置、多通道绑定以及SLVS-EC协议数据解析与图像重组的关键步骤,为高速视觉系统开发提供了宝贵的调试经验和系统集成指导。

efc12345678的博客 261

epoll机制

epoll机制:epoll_create、epoll_ctl、epoll_wait、close(在epoll的ET模式下,read和write或send和recv当返回值 在linux的网络编程中,很长的时间都在使用select来做事件触发。在linux新的内核中,有了一种替换它的机制,就是epoll。相比于select,epoll最大的好处在于它不会随着监听fd数目的增长而降低效率。因为在内核

bytxl的专栏 1013

3U 与 SV630A 伺服实现 CANLINK 通讯

SD410这组参数特别重要,这个32位特别重要,是防止数值乱码的关键。

weixin_42714122的博客 2694

epoll:EPOLLET模式下的正确读写方式

1.EPOLLLT和EPOLLET最大的区别在于事件的通知机制,看这个文章EPOLLLT和EPOLLET的区别 2.EPOLLET模式下并不意味着要循环读取完缓冲区的所有数据,贴出一段读取代码: n = 0; while ((nread = read(fd, buf + n, BUFSIZ-1)) > 0) { n += nread; } if (nread == -1 &&

daiyudong2020的博客 5233

西门子博途系列学习笔记SCL(三)______自由口通讯(RS485轮询程序)

西门子博途V16系列学习笔记SCL(三)___自由口通讯轮询程序(RS485) 西门子博途系列学习笔记SCL(三)______自由口通讯(RS485轮询程序) 文章目录西门子博途V16系列学习笔记SCL(三)___自由口通讯轮询程序(RS485)前言一、FreePort自由口通讯是什么?二、使用步骤1.模块参数定义2.定义FB功能块参数:3.程序代码如下(每天写代码100行,学不会你来找我):总结 前言 很长时间都没有更新了,主要是最近在学习罗克韦尔的STUDIO5000PLC编程软件,怎么说,和博

weixin_42940283的博客 1万+

Matlab在线性代数中的应用(一):向量组的线性相关性

求列向量组A的一个最大线性无关组可用命令rref(A)将A化成行最简形,其中单位向量对应的列向量即为最大线性无关组所含向量,其它列向量的坐标即为其对应向量用最大线性无关组线性表示的系数。 01 — 例1 求下列矩阵列向量组的一个最大无关组。 解:编写脚本文件如下: >>format rat a=[1,-2,-1,0,2;-2,4,2,6,-6;2,-1,0,2,3;3,3,3,3,4]; b=rref(a) 求得: b...

wenyusuran的专栏 3235

Linux网络编程:epoll工作模式

【代码】Linux网络编程:epoll工作模式。

lichengyang的博客 192

Go语言面试:面试中经常被问到的50个经典面试题(附参考答案)

Go语言核心知识点摘要 基础语法与数据结构 make和new区别:new分配零值内存返回指针,make初始化引用类型返回实例 Slice底层:包含指针、长度、容量的结构体,多个slice可共享底层数组 nil与空slice:nil指针为nil,空slice指针非nil但JSON编码不同 Map原理:哈希表实现,非线程安全,扩容策略影响性能 for range注意:循环变量是拷贝,map遍历无序 defer执行:LIFO顺序,函数返回前执行 Struct比较:仅当所有字段可比较时才可比较 参数传递:只有值传递

数据知道的博客 4718

【网络】epoll理论 + 实践(LT模式服务器和ET模式服务器)详细讲解

- 三个Epoll接口 - Epoll原理 - 编写Epoll的LT模式服务器 - 编写Epoll的ET模式服务器

You don't have the guts to be what you wanna be. 882

Altium Designer(AD)仿真实验操作指南

1:运行仿真2:设置仿真3:放置电源模块4:放置器件模块5:探针。

XU157303764的博客 8886

100天精通Python(爬虫篇)——第119天:基于selenium实现隐藏浏览器指纹特征(反反爬策略)

1. 什么是浏览器指纹? 2. 爬虫隐藏浏览器指纹特征的好处? 3. 手动打开浏览器指纹情况 4. 无界面模式打开浏览器 5. 脚本隐藏浏览器指纹特征

努力让自己发光,对的人才能迎着光而来 8万+

彻底学会使用epoll(二)——ET的读写操作实例分析

相关视频推荐 面试中正经“八股文”网络原理tcp/udp,网络编程epoll/reactor epoll 原理剖析 以及 reactor 模型应用 epoll原理剖析以及三握四挥的处理 LinuxC++后台服务器开发架构师免费学习地址 彻底学会使用epoll(一)——ET模式实现分析 接上一篇 首先,看程序四的例子。 程序四 #include <unistd.h> #include <iostream> #include <sys/epoll.h> u

资料qun832218493 976

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

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

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

weixin_28673511的博客 8969

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

高级IO(epoll)(ET)

epoll工作方式你妈喊你吃饭的例子你正在吃鸡, 眼看进入了决赛圈, 你妈饭做好了, 喊你吃饭的时候有两种方式: 1. 如果你妈喊你一次, 你没动, 那么你妈会继续喊你第二次, 第三次...(亲妈, 水平触发) 2. 如果你妈喊你一次, 你没动, 你妈就不管你了(后妈, 边缘触发)epoll有2种工作方式-水平触发(LT)和边缘触发(ET)假如有这样一个例子:我们已经把一个tcp socket添加到epoll描述符这个时候socket的另一端被写入了2KB的数据。

ljw的博客 3245

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

彻底学会使用epoll(一)——ET模式实现分析

1. ET模式实现分析 1.1 ET和LT的实现区别 首先给出下面一张图,这张图是从我之前的一篇博文——epoll实现分析中摘取并细化的。这张图对理解ET模式已经epoll的工作过程只管重要,当然我自己总结出来后也感觉有的小成就,在这里与大家分享。 注:上图的poll不要理解成和select相似那个poll,这是通过epoll_ctl调用的。 相关视频推荐 面试中正经“八股文”网络原理tcp/udp,网络编程epoll/reactor epoll 原理剖析 以及 reactor 模型应用

资料qun832218493 846

彻底学会使用epoll(三)——ET的读操作实例分析

首先看程序一,这个程序想要实现的功能是当用户从控制台有任何输入操作时,输出”hello&nbsp;world!”。 l&nbsp;程序一 &nbsp;&nbsp; 点击(此处)折叠或打开 #include&nbsp;&lt;unistd.h&gt; #include&nbsp;&lt;iostream&gt; #inclu...

BangBang的博客 215
上一篇: 彻底学会使用epoll(三)——ET的读操作实例分析
下一篇: 彻底学会使用epoll(五)—— ET模式下的注意事项
xiaofei0859
博客等级 码龄18年 454粉丝 55原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值