简单理解epoll

2023-05-16

epoll系列系统调用

epoll是Linux特有的I/O复用函数。

  epoll使用一组函数来完成任务。epoll把用户关心的文件描述符上的事件放在内核里的一个事件表中。

  epoll需要使用一个额外的文件描述符,来唯一标识内核中的事件表。

epoll事件表的文件描述符创建函数:

#include <sys/epoll.h>
int epoll_create( int size );

参数:

  • 参数size:并不起作用,只是给内核一个提示,告诉它事件表需要多大。

     该函数返回的文件描述符将用作其他所有epoll系统调用的第一次参数,以指定要访问的内核事件表。
    

epoll系统调用的内核事件表操作函数:

#include <sys/epoll.h>
int epoll_ctl( int epfd, int op, int fd, struct epoll_event* event );

参数:

  • 参数epfd:内核事件表的文件描述符;
  • 参数fd:要操作的文件描述符;
  • 参数op:指定操作类型;
  • 参数event:指定事件,它是epoll_event结构指针类型;

epoll_ctl成功时返回0,失败则返回-1并设置errno。

操作类型

名称作用
EPOLL_CTL_ADD往事件表中注册fd上的事件
EPOLL_CTL_MOD修改fd上的注册事件
EPOLL_CTL_DEL删除fd上的注册事件

epoll_event的定义:

struct epoll_event
{
			__uint32_t events;   /* epoll事件 */
			epoll_data_t data;   /* 用户数据 */
};

结构体成员:

  1. events成员描述事件类型。epoll支持的事件类型和poll基本相同。表示epoll事件类型的宏是在poll对应的宏前加上"E",比如epoll的数据可读事件是EPOLLIN。但epoll由俩个额外的事件类型—EPOLLET和EPOLLONESHOT。
  2. data成员用于存储用户数据。

epoll的事件类型

事件描述是否可作为输入是否可作为输出
EPOLLIN数据(包括普通数据和优先数据)可读
EPOLLRDNORM普通数据可读
EPOLLRDBAND优先带数据可读(Linux不支持)
EPOLLPRI高优先级数据可读,比如TCP带外数据
EPOLLOUT数据(包括普通数据和优先数据)可写
EPOLLWRNORM普通数据可写
EPOLLWRBAND优先级数据可写
EPOLLRDHUPTCP链接被对方关闭,或者对方关闭写操作。它由GNU引入
EPOLLERR错误
EPOLLHUP挂起
EPOLLNVAL文件描述符没有打开
EPOLLET开启高效模式
EPOLLONSHOT操作系统最多触发其上注册的一个可读、可写或异常事件,且只触发一次

epoll_data_t的定义:

typedef union epoll_data
{
		void* ptr;
		int fd;
		uin32_t u32;
		uin64_t u64;
}epoll_data_t;

联合体成员:

  1. 成员 ptr:用于指定与fd相关的用户数据;

  2. 成员 fd :指定事件所从属的目标文件描述符;

     由于epoll_data_t是一个联合体,所有不能同时使用其成员ptr和成员fd、因此,如果要将文件描述符和用户数据关联起来,以实现快速的数据访问,只能使用其他手段。比如放弃使用epoll_data_t的fd成员,而在ptr指向的用户数据中包含fd。
    

epoll系统调用的接口函数:

在一段超时时间内等待一组文件描述符上的事件。

#include <sys/epoll.h>
int epoll_wait( int epfd, struct epoll_event* events, int maxevents,int timeout );

参数:

  • 参数epfd:内核事件表的文件描述符;
  • 参数events:epoll_wait如果检测到事件,就将所有就绪的事件从内核事件表(由epfd参数指定)中复制到参数events指向的数组中,这个数组只用于输出epoll_wait检测到的就绪事件;
  • 参数maxevents:指定最多监听多少个事件,它必须大于0;
  • 参数timeout:指定epoll的超时值,单位是毫秒。当timeout为 -1时,epoll调用将永远阻塞,直到某个事件发生;当timeout为0时,poll调用将立即返回。

LT和ET模式

     epoll对文件描述符的操作有俩种模式:LT(Level Trigger,条件触发)模式和ET(Edge Trigger,边缘触发)模式。
     LT模式事默认的工作模式,这种模式下epoll相当于一个效率较高的poll。ET模式事epoll的高效工作模式。

LT工作模式:当epoll_wait检测到其上有事件发生并将此事件通知应用程序后,应用程序可以不立即处理该事件。当应用程序下一次调用epoll_wait时,epoll_wait还会再次向应用程序通告此事件,直到该事件被处理。

ET工作模式:当epoll_wait检测到其上有事件发生并将此事件通知应用程序后,应用程序必须立即处理该事件,因为后续的epoll_wait调用将不再向应用程序通知这一事件。

注:每个使用ET模式的文件描述符都应该是非阻塞的。如果文件描述符是阻塞的,那么读或写操作将会因为没有后续的事件而一直处于阻塞状态(饥渴状态)。

EPOLLONESHOT事件

    对于注册了EPOLLONESHOT事件的文件描述符,操作系统最多触发其上注册的一个可读、可写或者异常事件,且只触发一次,除非使用epoll_ctl函数重置该文件描述符上注册的EPOLLONESHOT事件。

    注册了EPOLLONESHOT事件的socket一旦被某个线程处理完毕,该线程就应该立即重置这个socket上的EPOLLONESHOT事件,以确保这个socket下一次可读时,其EPOLLIN事件能被触发,进而让其他工作线程有机会继续处理这个socket。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

简单理解epoll 的相关文章

随机推荐

  • 2019 计蒜之道 复赛 D “星云系统”

    2019 计蒜之道 复赛 D 星云系统 题目 现在给定你一个字符串s以及一个整数k xff0c 请求出s的字典序最小的长度为k的子序列 题目链接https nanti jisuanke com t 39614 输入格式 第一行一个由小写英文
  • Linux mysql 配置

    一 数据库处室化密码 刚刚装好的数据库需要重置密码 alter user user identified by 39 12345678 39 如果是测试环境 或者自己玩的环境 设置密码过于简单 可以通过一下命令修改关于密码的校验 set g
  • 二进制安装Kubernetes(k8s) v1.26.0 IPv4/IPv6双栈

    二进制安装Kubernetes xff08 k8s xff09 v1 26 0 IPv4 IPv6双栈 https github com cby chen Kubernetes 开源不易 xff0c 帮忙点个star xff0c 谢谢了 介
  • ThinkPad E430 蓝牙驱动 BCM43142A0

    最近我意外发现公司的 ThinkPad E430 笔记本竟然是带有蓝牙的 D 查看蓝牙设备标识 ID 利用 lsusb 命令找到蓝牙模块信息 Bus 001 Device 004 ID 105b e065 Foxconn Internati
  • cephadm 安装部署 ceph 集群

    介绍 手册 xff1a https access redhat com documentation zh cn red hat ceph storage 5 html architecture guide index http docs c
  • PVE Cloud-INIT 模板配置

    PVE Cloud INIT 模板配置 Cloud init是什么 Cloud init是开源的云初始化程序 xff0c 能够对新创建弹性云服务器中指定的自定义信息 xff08 主机名 密钥和用户数据等 xff09 进行初始化配置 通过Cl
  • openstack 环境部署

    22 1 了解云计算 人类基于千年的物种衍变基础 xff0c 在这个世纪终于有了爆发式的科技成果 xff0c 尤其这二十年内互联网的发展 xff0c 更像是一种催化剂 xff0c 让原本已经热闹的地球更加的沸腾 xff0c 互联网经济泡沫破
  • C语言,计算圆的面积程序

    C语言 xff0c 计算圆的面积程序 span class token comment 计算圆的面积程序 日期 xff1a 2020 8 29 姓名 xff1a 张倩峰 span span class token macro propert
  • 博图软件搜索不到网卡

  • 台达伺服手动调试

  • 博途V15.1激活工具出错。

    博图V15 1激活 xff0c 软件出错 出现以下报错信息 解决方法 xff1a 下载新版本激活工具 再次激活
  • winCC正常运行,不显示画面。

    winCC正常运行 xff0c 不显示画面 解决方法 xff1a 需要重装系统 xff0c 重新安装博途
  • S7-1500PLC仿真

    S7 1500PLC仿真
  • 一些已安装产品需要许可证,请启动Automation License Manager

    更新系统版本号 完成更新 xff0c 再次安装即可解决该问题
  • ubuntu 硬盘管理工具

    就我目前所用的系统举例说明吧 xff0c 应该都大同小异的 有图形界面的 xff0c 也有命令行的 xff1a 首先是 ubuntu 系统自带的 Disk Utility 工具集 利用该工具可以对硬盘进行 Format Drive View
  • MCS-51单片机,定时1分钟,汇编程序

    MCS 51单片机 xff0c 定时1分钟 xff0c 汇编程序 去博客设置页面 xff0c 选择一款你喜欢的代码片高亮样式 xff0c 下面展示同样高亮的 代码片 span class token constant ORG span 00
  • c++枚举字符串转换工具

    为什么会需要这样一个枚举转字符串 xff0c 字符串转枚举的工具 xff1f 在太多的工程中 xff0c 我们可能都需要将一些枚举 整形标记打到日志中去 xff0c 如果只打印数组 xff0c 那也不行啊 xff0c 出问题翻看日志 xff
  • AD16在PCB布局的时候如何批量复制布局布线!!

    本人也是看了很多博主的帖子反反复复推敲 xff0c 最后发现有的博主没讲到关键部分所以在批量复制布局的时候总是事与愿违 话不多说请看招 xff01 第一步选中需要复制的布局 xff01 如图所示 第二步 复制选中布局的 offset Cha
  • Atcoder abc250 题解 (A~G)

    A Adjacent Squares xff08 枚举 xff09 枚举一下 xff0c 满足题意则ans 43 43 即可 cin span class token operator gt gt span h span class tok
  • 简单理解epoll

    epoll系列系统调用 epoll是Linux特有的I O复用函数 epoll使用一组函数来完成任务 epoll把用户关心的文件描述符上的事件放在内核里的一个事件表中 epoll需要使用一个额外的文件描述符 xff0c 来唯一标识内核中的事