Edge trigger and level trigger of epoll

水平触发

  1. 对于读操作:只要缓冲内容不为空,LT模式返回读就绪。
  2. 对于写操作:只要缓冲区还不满,LT模式会返回写就绪。
#include <unistd.h>
#include <stdio.h>
#include <sys/epoll.h>int main()
{int epfd, nfds;char buf[256];struct epoll_event event, events[5];epfd = epoll_create(1);event.data.fd = STDIN_FILENO;event.events = EPOLLIN;  // LT是默认模式epoll_ctl(epfd, EPOLL_CTL_ADD, STDIN_FILENO, &event);while (1) {nfds = epoll_wait(epfd, events, 5, -1);int i;for (i = 0; i < nfds; ++i) {if (events[i].data.fd == STDIN_FILENO) {read(STDIN_FILENO, buf, 1);printf("hello world\n");}}}
}

结果:

# ./a.out
a
hello world
hello world
ab
hello world
hello world
hello world
abc
hello world
hello world
hello world
hello world

边缘触发

  1. 对于读操作
    (1)当缓冲区由不可读变为可读的时候,即缓冲区由空变为不空的时候。
    (2)当有新数据到达时,即缓冲区中的待读数据变多的时候。
    (3)当缓冲区有数据可读,且应用进程对相应的描述符进行EPOLL_CTL_MOD 修改EPOLLIN事件时。

  2. 对于写操作
    (1)当缓冲区由不可写变为可写时。
    (2)当有旧数据被发送走,即缓冲区中的内容变少的时候。
    (3)当缓冲区有空间可写,且应用进程对相应的描述符进行EPOLL_CTL_MOD 修改EPOLLOUT事件时。

#include <unistd.h>
#include <stdio.h>
#include <sys/epoll.h>int main()
{int epfd, nfds;struct epoll_event event, events[5];char buf[256];epfd = epoll_create(1);event.data.fd = STDIN_FILENO;event.events = EPOLLIN | EPOLLET;epoll_ctl(epfd, EPOLL_CTL_ADD, STDIN_FILENO, &event);while (1) {nfds = epoll_wait(epfd, events, 5, -1);int i;for (i = 0; i < nfds; ++i) {if (events[i].data.fd == STDIN_FILENO) {read(STDIN_FILENO, buf, 1);printf("hello world\n");}}}
}

结果:

# ./a.out
a
hello world
ab
hello world
abc
hello world

什么是epoll的水平触发与边缘触发?两段代码彻底理解相关推荐

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

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

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

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

  3. epoll边缘触发_4.2.3、epoll:水平触发与边缘触发

    select和poll都只提供了一个函数:select或者poll函数. 而epoll提供了三个函数,epoll_create,epoll_ctl和epoll_wait,epoll_create是创建 ...

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

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

  5. 移除类名没有触发transition_epoll边缘触发模式

    epoll(kqueue),支持两种事件触发模式.水平触发以及边缘触发. epoll实际可以监听多种描述符,下文主要以套接字介绍,并且假设同时注册了读/写. 水平触发:只要套接字可读/可写epollw ...

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

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

  7. 条件触发和边缘触发 及 epoll 的长处

    条件触发: 仅仅要输入缓冲有数据就会一直通知该事件 边缘触发: 输入缓冲收到数据时仅注冊1次该事件.即使输入缓冲中还留有数据,也不会再进行注冊 水平触发(level-triggered.也被称为条件触 ...

  8. C语言 epoll 工作模式之et 边缘触发 edge trigger

    友链 占位占位占位占位占位占位占位占位占位占位占位占位占位占位占位占位占位占位占位 占位占位占位占位占位占位占位占位占位占位占位占位占位占位占位占位占位占位占位 占位占位占位占位占位占位占位占位占位占 ...

  9. Epoll 的水平模式、边缘模式 与 Nginx

    读 水平模式(LE) 只要socket缓冲区有数据,且执行了EPOLL_CTL_ADD监听socket,内核就一直通知进程:即,只要内核通知了进程,但是进程没有read或者没有read完数据,就会触发 ...

最新文章

  1. 脱口秀演员入职华为?破案了:人家还是博士后研究员
  2. R语言与数据分析(9)R与Excel
  3. C#.NET如何判断是否有缺少的using
  4. 研华物联网论坛和ARM技术研讨会随笔
  5. 一个容易忽略的问题—Javascript文件加载的顺序
  6. java 10大常见异常
  7. 终端IO--unix环境高级编程读书笔记
  8. 月薪3W+,人才缺口高达19W,行业大牛5天带你零基础入门数据分析!
  9. win10和深度linux双系统,深度系统(deepin)与win10双系统切换设置
  10. 查看JDK版本和安装路径
  11. delphi盒子希腊打开潘多拉魔盒?债务重组或是唯一出
  12. App Store 评分和评论:用户评论如何影响 App Store 排名
  13. C. Anton and Fairy Tale
  14. SQL工具导出CSV文件中文乱码
  15. 仿饿了么、百度、美团外卖,订餐网站外卖系统
  16. ES搜索引擎-简单入门
  17. Linux dirname 命令
  18. batocera 完整包_Batocera Plus 2.0 中文整合版bt下载 8G和150G
  19. liunx下调整CPU参数获得高性能
  20. 2021年智能制造工程设计与应用类赛项:离散行业自动化方向(2)-项目方案设计书

热门文章

  1. python爬虫避免重复数据_No.2﹣Python﹣scan﹣anti-crawler(随机请求头和IP代理)取消链接和重复数据消除,NO2pythonscrapy,反,爬虫,去...
  2. oracle11g的tnstimeout,redhat下oracle11g 配置listener.ora
  3. 【Hive的高级查询详】
  4. phpstrom配置Xdebug
  5. webpack-dev-server
  6. 03 验证合法性连接的客户端
  7. [luoguP3068] [USACO13JAN]派对邀请函Party Invitations(stl大乱交)
  8. UITabBarController的一些基础设置
  9. 如何知道AppDomain租约是否已过期呢
  10. 用java完成一个模块_Java 9 揭秘(3. 创建你的第一个模块)