epoll ET与LT模式详解

文章详细介绍了Linux中epoll的ET(边缘触发)和LT(水平触发)两种模式的工作原理,通过示例程序展示了它们在读写事件处理上的差异。ET模式在有状态变化时触发,效率高但易丢失事件;LT模式在事件存在时持续触发,对编程要求较低。

一、epoll ET与LT模式详解

1、ET与LT介绍

EPOLLET,就是边缘触发模式(Edge Trigger,ET),而默认的模式称为水平触发模式(Level Trigger,LT),区别在于:

  • 水平触发模式,一个事件只要有,就会一直触发
  • 边缘触发模式,只有一个事件从无到有才会触发

下面以fd的读写事件为例,介绍这两种工作模式,如下:

场景一:fd读事件触发条件

水平模式:
1)fd上无数据 => fd上有数据
2)fd处于有数据状态
边缘模式:
1)fd上无数据 => fd上有数据
2)fd又新来一次数据

场景二:fd写事件触发条件

水平模式:
1)fd一直处于可写状态
2)fd不可写 => fd可写
边缘触发:
1)fd不可写 => fd可写
2)fd可以写的空间发生变化

2、通过Demo讲解ET与LT的差异

程序一:监听读事件,并分别设置成ET与LT模式

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

int main(void)
{
   
   
    int epfd, nfds;
    struct epoll_event ev, events[5]; // ev用于注册事件,数组用于返回要处理的事件
    epfd = epoll_create(1);           // 只需要监听一个描述符——标准输入
    ev.data.fd = STDOUT_FILENO;
    ev.events = EPOLLIN | EPOLLET;                      // 监听读状态同时设置ET模式
    epoll_ctl(epfd, EPOLL_CTL_ADD, STDOUT_FILENO, &ev); // 注册epoll事件
    for (;;) {
   
   
        nfds = epoll_wait(epfd, events, 5, -1);
        for (int i 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值