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

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

前言

本篇文章主要来讲解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;
}

总结

本篇文章就讲解到这里。


相关文章
|
1月前
|
安全 Linux 网络安全
Web安全-Linux网络协议
Web安全-Linux网络协议
54 4
|
1月前
|
机器学习/深度学习 安全 网络协议
Web安全-Linux网络命令
Web安全-Linux网络命令
22 1
|
28天前
|
网络协议 Linux
Linux 网络配置
了解基本命令与权限后,如何让Linux系统联网?可通过编辑`/etc/sysconfig/network-scripts/`下的`ifcfg-ethX`文件配置网卡,其中`ethX`代表第X块网卡。对于DHCP自动获取或静态IP,需设置`BOOTPROTO`参数,并指定IP、子网掩码和网关等。配置完成后,运行`/etc/init.d/network restart`重启网络。DNS可在`/etc/resolv.conf`中设置,添加`nameserver`行即可,无需重启网卡。配置好后,可用`ifconfig`查看IP信息,并通过远程工具如SecureCRT连接服务器。
48 0
|
1月前
|
域名解析 负载均衡 网络协议
Linux网络接口配置不当所带来的影响
总而言之,Linux网络接口的恰当配置是保证网络稳定性、性能和安全性的基础。通过遵循最佳实践和定期维护,可以最大程度地减少配置错误带来的负面影响。
72 0
|
2月前
|
存储 Linux 网络安全
【Azure 存储服务】如何把开启NFS 3.0协议的Azure Blob挂载在Linux VM中呢?(NFS: Network File System 网络文件系统)
【Azure 存储服务】如何把开启NFS 3.0协议的Azure Blob挂载在Linux VM中呢?(NFS: Network File System 网络文件系统)
|
2月前
|
存储 Linux 网络安全
【Azure 应用服务】App Service For Linux 如何在 Web 应用实例上住抓取网络日志
【Azure 应用服务】App Service For Linux 如何在 Web 应用实例上住抓取网络日志
|
2月前
|
网络协议 Linux Shell
【Azure 应用服务】App Service For Linux 中安装paping, 用于验证从App Service向外请求的网络连通性
【Azure 应用服务】App Service For Linux 中安装paping, 用于验证从App Service向外请求的网络连通性
|
4天前
|
SQL 安全 网络安全
云计算与网络安全:技术融合下的信息安全挑战与应对
【9月更文挑战第36天】在数字化浪潮的推动下,云计算已成为企业和个人不可或缺的技术支撑。然而,随着云服务的广泛应用,网络安全问题亦日益凸显。本文深入探讨了云计算环境下的网络安全挑战,并提出了相应的安全策略和技术解决方案。通过分析云服务的安全架构、网络攻击类型以及防御机制,旨在为读者提供一套完整的云计算网络安全指南。
|
2天前
|
安全 网络安全 数据安全/隐私保护
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益严重。本文将从网络安全漏洞、加密技术和安全意识三个方面,探讨如何保护个人信息和网络安全。我们将通过实例分析,了解网络攻击者如何利用安全漏洞进行攻击,以及如何运用加密技术防止数据泄露。同时,我们还将讨论提高个人和企业的安全意识的重要性。
|
3天前
|
SQL 存储 安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享##
网络安全与信息安全是当今数字化世界中的重要议题,涉及网络漏洞、加密技术和安全意识等方面。本文将探讨这些关键问题,旨在提升读者对网络安全的认知和应对能力。通过了解常见的网络安全漏洞类型及其影响,掌握加密技术的基本原理和应用,以及培养良好的安全意识和行为习惯,我们可以有效保护自己的隐私和数据安全。网络安全不仅仅是技术问题,更是每个人都应该关注和参与的重要事项。希望通过这篇文章的分享,读者能够增强自身的网络安全意识,共同构建一个更加安全的网络环境。 ##