(1)应用 ET 模式的目的:改变 epoll_wait 的默认属性,可以减少调用 epoll_wait 函数的调用次数。
(2)思想由来:模拟电路的高低电频的思想。

水平触发: 持续的 1 持续的 0
边沿触发: 0 ->1 ;1 -> 0
(3)场景:
用 epoll 实现一个服务器,调用 epoll_wait 函数进行监听,此时 client 给 epoll 发送了 100 字节的数据,而 server 使用 read 函数读走 50 字节,剩余 50 字节,问题:epoll_wait 函数还触发么?
对于水平触发来说应该触发: 因为缓存区内还有数据没读完,你需要一直告知我。
2对于边沿触发来说不应该触发:因为 epoll_wait 的职责是告知 server 是否有读事件发生,我已经告知一次了,但是你有没有读完,你的事,我不管 。
(4)使用:默认是水平触发,若设置边沿触发,需要对监听事件的基础上加宏 EPOLLET。
(5)边沿触发实例:

#include <stdio.h>
#include <stdlib.h>
#include <sys/epoll.h>
#include <errno.h>
#include <unistd.h>
#define MAXLINE 10
int main(int argc, char *argv[])
{int efd, i; // efd -- epoll树根,i -- 循环因子char buf[MAXLINE], ch = 'a';int pfd[2]; pipe(pfd); // 创建管道 pfd[0]--读 pfd[1]--写pid_t pid = fork();if (pid == 0) // 子进程 写操作(模拟一个客户端的操作)
{ close(pfd[0]); // 关闭读端while (1) { for (i = 0; i < MAXLINE/2; i++)buf[i] = ch; // buf -- aaaaabuf[i-1] = '\n'; // buf -- aaaa\nch++; // 'a'--'b'for (; i < MAXLINE; i++) // 从 buf[5]开始buf[i] = ch; //buf -- aaaa\nbbbbbbuf[i-1] = '\n'; //buf -- aaaa\nbbbb\nch++; // 'b'--'cwrite(pfd[1], buf, sizeof(buf)); // 将buf写入 管道 --- aaaa\nbbbb\nsleep(5);} // 周期的向管道内写,再写就是 cccc\ndddd\nclose(pfd[1]);
}
else if (pid > 0) // 父进程读操作 (模拟一个服务器的操作)
{ struct epoll_event event;struct epoll_event resevent[10]; // epoll_wait就绪返回eventint res, len;close(pfd[1]); // 关闭写端efd = epoll_create(10); // 创建epoll红黑树根event.events = EPOLLIN | EPOLLET; // ET 边沿触发 -- epoll_wait只告知server一次// 注意:event.events = EPOLLIN; // LT 水平触发 (默认)event.data.fd = pfd[0];epoll_ctl(efd, EPOLL_CTL_ADD, pfd[0], &event); // 上树while (1) {res = epoll_wait(efd, resevent, 10, -1); // 监测读端if (resevent[0].data.fd == pfd[0]) { // 如果管道里有数据需要读len = read(pfd[0], buf, MAXLINE/2); // 边沿:只读取一半 // 如果是水平触发,则全读 write(STDOUT_FILENO, buf, len);}
}close(pfd[0]); // 父进程读结束,关闭读端close(efd); // 关闭树根
}
else
{perror("fork");exit(-1);}return 0;
}

结果:
水平触发结果:

父进程 epoll_wait 阻塞(epollt 认为没数据才是读事件结束,没有次数限制)。

父进程 epoll_wait 阻塞。
边沿触发结果:

父进程 epoll_wait 阻塞(epollt 认为每读一次就是读事件结束)。

父进程 epoll_wait 阻塞。

epoll 边沿触发(ET 模式)和水平触发(LT 模式)相关推荐

  1. linux网络编程 epoll水平触发、边沿触发、反应堆模型、线程池思想

    打开文件上限的设置可修改配置文件: etc/security/limits.conf 水平.边沿触发: 若客户端发送1000B数据,服务器一次只读500B.在水平触发的模式下,服务器会再调用一次epo ...

  2. 五种高级IO | select poll epoll 水平触发模式 边缘触发模式 惊群问题

    一.高级IO 在介绍多路复用IO之前,先介绍一下其它四种高级IO: 阻塞IO: 在内核将数据准备好之前,系统调用会一直等待.所以的套集字默认是阻塞方式. 非阻塞IO: 在内核还未将数据准备好,则系统调 ...

  3. 实例浅析epoll的水平触发和边缘触发,以及边缘触发为什么要使用非阻塞IO

    一.基本概念 我们通俗一点讲: Level_triggered(水平触发):当被监控的文件描述符上有可读写事件发生时,epoll_wait()会通知处理程序去读写.如果这次没有把数据一次性全部读写完( ...

  4. Linux网络编程 | 多路复用I/O :select、poll、epoll、水平触发与边缘触发、惊群问题

    文章目录 多路复用IO 多路复用IO的概念 多路复用IO与多线程/多进程的并发 多路复用IO模型进行服务器并发处理 多线程/多进程进行服务器并发处理 select 工作原理 接口 优缺点 select ...

  5. epoll 边沿触发 非阻塞 IO 服务器

    在之前的文章中提到过Readn 函数: ssize_t Readn(int fd, void *vptr, size_t n) 试想这样一种情况: 1.server 循环使用 epoll_wait,监 ...

  6. epoll关于ET、LT模式和socket非阻塞模式的几个总结

    epoll的ET和LT模式 LT水平触发是默认的模式,只要缓冲区有消息就会触发,如果这次事件没有被处理,那么下一次调用epoll_wait的时候,事件仍然会被触发:ET边沿触发只会在第一次有消息的时候 ...

  7. 水平触发LT、边缘触发ET

    Level_triggered(水平触发 LT):当被监控的文件描述符上有可读写事件发生时,epoll_wait()会通知处理程序去读写.如果这次没有把数据一次性全部读写完(如读写缓冲区太小),那么下 ...

  8. epoll哪些触发模式_5.epoll的水平触发和边缘触发

    本篇是多路复用的第五篇,主要来讲解epoll的水平触发和边缘触发是怎么回事. 一.概念介绍 EPOLL事件有两种模型,水平出发和边缘触发,如下所示: 1. Level Triggered (LT) 水 ...

  9. epoll边缘触发_epoll事件通知机制详解,水平触发和边沿触发的区别

    看到网上有不少讨论epoll,但大多不够详细准确,以前面试有被问到这个问题.不去更深入的了解,只能停留在知其然而不知其所以然.于是,把epoll手册翻译一遍,更深入理解和掌握epoll事件处理相关知识 ...

最新文章

  1. mysql一对多分类_mysql一对多结果归类
  2. 通过TCP调试助手传输数据时的注意事项
  3. 《JavaScript应用程序设计》一一2.17 回调函数
  4. 任务管理器中arcsom.exe和arcsoc.exe的个数问题
  5. OC中iO操作相关方法
  6. vue 时间插件_Vue插件丨vxe-table初体验
  7. java实现SPFA算法
  8. 搜索和内容生态的关系
  9. JavaCV 第一个JavaCV程序
  10. 「大数据成神之路」第四版更新完毕
  11. [PKKS19] 《Revealing Scenes by Inverting Structure from Motion Reconstructions》(CVPR2019)阅读笔记(完)
  12. Computer Shader的理解记录
  13. 软件工程实训有必要吗_软件工程实训总结
  14. matlab保存pgm图形,matlab读写pgm文件
  15. 解决多线程安全问题的几种方式?
  16. 如何将stl模型,转换成点云文件)
  17. 博客系统 - 数据库设计(二)
  18. 智慧水务整体解决方案
  19. 手机静电放电ESD测试及其整改措施
  20. 如何检测判断mos管好坏,判断mos管好坏都有哪些方法?

热门文章

  1. 四十六、MongoDB数据库学习
  2. sscanf取固定长度的int_翠屏摇臂式取水泵船长沙水泵厂专业设计中大泵业
  3. 贝叶斯神经网络对梯度攻击的鲁棒性
  4. 无惧秋招,您的NLP算法工程师魔鬼训练计划请查收
  5. 中国学霸们被世界名校集体退学,原因竟然是……
  6. 4周,从入门小白到爬虫老炮儿,薪资水平超过60% IT新手!
  7. 经典论文复现 | ICML 2017大热论文:Wasserstein GAN
  8. POJ1088 滑雪 记忆化搜索
  9. python中单双三引号区别_python基础题
  10. mysql锁争用_关于MYSQL条件竞争与锁的问题