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;
}

总结

本篇文章就讲解到这里。


相关文章
|
10月前
|
安全 Linux 网络安全
Nipper 3.9.0 for Windows & Linux - 网络设备漏洞评估
Nipper 3.9.0 for Windows & Linux - 网络设备漏洞评估
267 0
Nipper 3.9.0 for Windows & Linux - 网络设备漏洞评估
|
11月前
|
运维 Linux 开发者
Linux系统中使用Python的ping3库进行网络连通性测试
以上步骤展示了如何利用 Python 的 `ping3` 库来检测网络连通性,并且提供了基本错误处理方法以确保程序能够优雅地处理各种意外情形。通过简洁明快、易读易懂、实操性强等特点使得该方法非常适合开发者或系统管理员快速集成至自动化工具链之内进行日常运维任务之需求满足。
693 18
|
11月前
|
网络协议 关系型数据库 Linux
【App Service Linux】在Linux App Service中安装 tcpdump 并抓取网络包
在App Service for Linux环境中,无法像Windows一样直接使用网络排查工具抓包。本文介绍了如何通过TCPDUMP在Linux环境下抓取网络包,包括SSH进入容器、安装tcpdump、执行抓包命令及下载分析文件的完整操作步骤。
512 5
|
12月前
|
Web App开发 网络协议 Linux
【Linux】网络基础
TCP/IP五层模型是网络通信的基础框架,将复杂的数据传输过程分为物理层、数据链路层、网络层、传输层和应用层,每层各司其职,协同完成远程通信。该模型确保了不同设备和网络之间的互联互通,是现代互联网运行的核心机制。
1364 5
|
安全 网络协议 Linux
Linux网络应用层协议展示:HTTP与HTTPS
此外,必须注意,从HTTP迁移到HTTPS是一项重要且必要的任务,因为这不仅关乎用户信息的安全,也有利于你的网站评级和粉丝的信心。在网络世界中,信息的安全就是一切,选择HTTPS,让您的网站更加安全,使您的用户满意,也使您感到满意。
418 19
|
12月前
|
网络协议 Linux 开发者
深入Linux中UDP网络通信机制编程探索
以上步骤概述了Linux中UDP网络通信的编程机制。在实现时,因关注细节和上下文环境可能有所调整,但大致流程是一致的。这些知识片段旨在帮助开发者快速上手Linux下的UDP编程,并提供可靠的信息作为编程的基础。在编程实践中,应结合实际业务需求,设计合适的数据传输协议,确保数据的正确性和实时性。
255 0
|
Linux 数据安全/隐私保护
使用Linux命令行接入无线网络Wi-Fi的示例。
现在,你已经使用命令行成功地连接到 Wi-Fi 网络了。这两个示例涵盖了用 `nmcli` 和 `wpa_supplicant` 连接无线网络的常见场景,让你能够不依赖图形化界面来完成这个任务。在日常使用中熟练掌握这些基本操作能增强你对 Linux 系统的理解,帮助你更有效地处理各种问题。
1127 12
|
SQL 安全 网络安全
网络安全与信息安全:知识分享####
【10月更文挑战第21天】 随着数字化时代的快速发展,网络安全和信息安全已成为个人和企业不可忽视的关键问题。本文将探讨网络安全漏洞、加密技术以及安全意识的重要性,并提供一些实用的建议,帮助读者提高自身的网络安全防护能力。 ####
519 17
|
SQL 安全 网络安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益突出。本文将从网络安全漏洞、加密技术和安全意识三个方面进行探讨,旨在提高读者对网络安全的认识和防范能力。通过分析常见的网络安全漏洞,介绍加密技术的基本原理和应用,以及强调安全意识的重要性,帮助读者更好地保护自己的网络信息安全。
382 10
|
存储 SQL 安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益突出。本文将介绍网络安全的重要性,分析常见的网络安全漏洞及其危害,探讨加密技术在保障网络安全中的作用,并强调提高安全意识的必要性。通过本文的学习,读者将了解网络安全的基本概念和应对策略,提升个人和组织的网络安全防护能力。