首页 > 系统相关 >Linux网络编程(epoll的ET模式和LT模式)

Linux网络编程(epoll的ET模式和LT模式)

时间:2023-08-20 10:06:04浏览次数:35  
标签:触发 epoll 模式 events LT 事件 event

(文章目录)


前言

本篇文章主要来讲解epoll的ET模式和LT模式,epoll中有两种模式可以选择一种是ET模式(边缘触发模式),另一种是LT模式(水平触发模式)

一、ET模式和LT模式概念讲解

1.水平触发模式(LT,Level-Triggered)

在水平触发模式下,当一个文件描述符上的I/O事件就绪时,epoll会立即通知应用程序,然后应用程序可以对就绪事件进行处理。即,只要文件描述符处于就绪状态,epoll就会持续通知应用程序,直到应用程序处理完所有就绪事件并且再次进入阻塞等待状态。

对于非阻塞I/O,如果一个文件描述符上有可读或可写事件发生,应用程序可以立即进行读或写操作,即使读写操作无法一次完成。如果读或写操作不能立即完成,应用程序可以再次调用epoll等待新的事件通知。

2.边缘触发模式(ET,Edge-Triggered)

在边缘触发模式下,当一个文件描述符上的状态发生变化时(例如从不可读变为可读,或者从不可写变为可写),epoll会通知应用程序。 与水平触发模式不同的是,边缘触发模式只在状态变化的瞬间通知应用程序,通知仅发送一次。如果应用程序没有及时处理完这个事件,下次等待时将会错过该事件,即使事件仍然处于就绪状态。因此,在边缘触发模式下,应用程序需要确保尽可能完整地处理每个事件,以避免遗漏事件。

边缘触发模式适用于需要及时响应状态变化的场景,通常可以提供更高的性能,因为它最大程度上减少了不必要的事件通知。

二、边缘触发和水平触发适用的场景

边缘触发(ET)模式适用的情况:

需要尽快处理就绪事件:边缘触发模式通知应用程序文件描述符状态发生变化的时刻,要求应用程序立即对就绪事件进行处理。适用于需要高精度的事件处理,减少事件丢失的情况。 非阻塞I/O操作:边缘触发模式对非阻塞I/O操作更加高效,适用于需要按需处理大量数据的情况。

#include <stdio.h>
#include <sys/epoll.h>
#include <fcntl.h> // 包含非阻塞I/O所需的头文件

int main() {
    int epoll_fd = epoll_create1(0);
    struct epoll_event event;
    struct epoll_event events[10]; // 用于存储事件的数组

    // 向epoll实例注册文件描述符和事件
    event.events = EPOLLIN | EPOLLET; // 边缘触发模式
    event.data.fd = 0; // 示例中使用标准输入的文件描述符
    if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, 0, &event) == -1) {
        perror("Failed to add file descriptor to epoll");
        return -1;
    }

    // 设置标准输入为非阻塞模式
    int flags = fcntl(0, F_GETFL, 0);
    flags |= O_NONBLOCK;
    fcntl(0, F_SETFL, flags);

    // 等待事件发生
    while (1) {
        int num_events = epoll_wait(epoll_fd, events, 10, -1);
        if (num_events == -1) {
            perror("Failed to wait for events");
            return -1;
        }

        for (int i = 0; i < num_events; i++) {
            if (events[i].data.fd == 0) {
                // 标准输入有数据可读
                char buffer[100];
                ssize_t num_bytes = read(0, buffer, sizeof(buffer));
                if (num_bytes > 0) {
                    // 处理读取的数据
                    // ...
                }
            }
        }
    }

    return 0;
}

水平触发(LT)模式适用的情况:

需要持续处理就绪事件:水平触发模式会持续通知应用程序文件描述符就绪,直到应用程序处理完所有就绪事件。适用于需要处理多个相关事件或者需要一次性处理大量数据的情况。 阻塞和非阻塞I/O操作混合使用:水平触发模式适用于既有阻塞又有非阻塞I/O操作的情况,可以在阻塞操作中循环调用读取或写入操作。

#include <stdio.h>
#include <sys/epoll.h>

int main() {
    int epoll_fd = epoll_create1(0);
    struct epoll_event event;
    struct epoll_event events[10]; // 用于存储事件的数组

    // 向epoll实例注册文件描述符和事件
    event.events = EPOLLIN; // 水平触发模式(默认模式)
    event.data.fd = 0; // 示例中使用标准输入的文件描述符
    if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, 0, &event) == -1) {
        perror("Failed to add file descriptor to epoll");
        return -1;
    }

    // 等待事件发生
    while (1) {
        int num_events = epoll_wait(epoll_fd, events, 10, -1);
        if (num_events == -1) {
            perror("Failed to wait for events");
            return -1;
        }

        for (int i = 0; i < num_events; i++) {
            if (events[i].data.fd == 0) {
                // 标准输入有数据可读
                char buffer[100];
                ssize_t num_bytes = read(0, buffer, sizeof(buffer));
                // 处理读取的数据
                // ...
            }
        }
    }

    return 0;
}

总结

本篇文章就讲解到这里。

标签:触发,epoll,模式,events,LT,事件,event
From: https://blog.51cto.com/u_16153875/7157029

相关文章

  • 在 win10 2021 LTSC 上安装配置 wsl2 和 ubuntu
    在win102021LTSC上安装配置wsl2和ubuntu的过程:win10系统启用wsl2:wsl--install----no-distribution(安装wsl2,会自动打开系统feature:wsl子系统,虚拟机平台.不再需要去控制面板--启用windows特性)设置wsl默认版本为wsl2:wsl--set-defa......
  • 设计模式-单例模式
    饿汉式/***饿汉式,类加载的时候就会初始化**问题:*1.通过反射可以破坏单例*2.通过反序列化破坏单例*3.通过Unsafe破坏单例,无法解决**@author:optimjie*@date:2023-08-1921:37*/publicclassSingleton1{privateSingleton1()......
  • 正则表达式:贪婪与非贪婪模式
    正则中的三种模式,贪婪匹配、非贪婪匹配和独占模式。在这6种元字符中,我们可以用{m,n}来表示(*)(+)(?)这3种元字符:贪婪模式,简单说就是尽可能进行最长匹配。非贪婪模式呢,则会尽可能进行最短匹配。正是这两种模式产生了不同的匹配结果。贪婪匹配(Greedy)在正则中,表示次数的量词默认是贪......
  • 适配器模式
    将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。参考:https://baike.baidu.com/item/%E9%80%82%E9%85%8D%E5%99%A8%E6%A8%A1%E5%BC%8F/10218946?fr=ge_ala......
  • 【补充】为什么Windows不支持epoll
    【补充】为什么Windows不支持epoll【一】为什么Windows不支持epoll:epoll是Linux系统提供的一种IO多路复用机制,而Windows系统并没有提供与之等价的底层机制。Windows使用一种名为I/O完成端口(I/OCompletionPort)的技术来实现高效的异步IO处理。虽然epoll和......
  • 【补充】Python中实现单例模式的六种常见方法
    【补充】Python中实现单例模式的六种常见方法【1】类属性:classSingleton:instance=None@classmethoddefgetInstance(cls):ifcls.instanceisNone:cls.instance=Singleton()returncls.instance使用类属性保存实......
  • 【补充】软件开发模式对比(瀑布、迭代、螺旋、敏捷)
    【补充】软件开发模式对比(瀑布、迭代、螺旋、敏捷)【1】瀑布模式(WaterfallModel):介绍:瀑布模式是一种线性的开发模式,各个阶段按顺序依次执行,每个阶段严格依赖前一阶段的输出。开发过程划分为需求分析、系统设计、编码、测试和运维等阶段。每个阶段的结果都在下一个阶段开始......
  • 设计模式串讲
    BehavioralDesignPatterns行为模式行为模式负责对象之间的高效沟通和职责委派,这些模式刻画了运行时难以跟踪的复杂控制流,从而把开发者的注意力从控制流转移到对象间的联系方式上。行为模式不仅描述对象或类的模式,还描述它们之间的通信模式。行为类模式使用继承机制在类间分派......
  • 【wxauto】新版PC端微信报错:LookupError: Find Control Timeout(10s): {Name: ‘输入
    微信版本:3.9.5.81调用后报错“LookupError:FindControlTimeout(10s):{Name:'输入',ControlType:EditControl}”按照Issues#107说的修改后是不报错,但是没有效果,不能自动发送消息 解决方案:在wxauto.py的文件中找到WeChat的类,并添加下述方法defChangeWindo......
  • gpio = <&gpio0 RK_PA6 GPIO_ACTIVE_HIGH>;含义
    gpio=<&gpio0RK_PA6GPIO_ACTIVE_HIGH>;第一个参数是GPIO编号 第二个参数是GPIO引脚一般GPIO有32个引脚 定义在kernel-4.19\include\dt-bindings\pinctrl\rockchip.h#defineRK_GPIO00#defineRK_GPIO11#defineRK_GPIO22#defineRK_GPIO33#defin......