epoll多路复用-----epoll_create1()、epoll_ctl()、epoll_wait()

2023-11-07

#include <sys/epoll.h>
int epoll_create1(int flags);
功能:创建一个多路复用的实例
参数:
flags:
0:如果这个参数是0,这个函数等价于poll_create(0)
EPOLL_CLOEXEC:这是这个参数唯一的有效值,如果这个参数设置为这个。那么当进程替换映像的时候会关闭这个文件描述符,这样新的映像中就无法对这个文件描述符操作,适用于多进程编程+映像替换的环境里
返回值:
success:返回一个非0 的未使用过的最小的文件描述符
error:-1 errno被设置

--------------------------------------------------------------------

int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
功能:操作一个多路复用的文件描述符
参数:
epfd:epoll_create1的返回值
op:要执行的命令
EPOLL_CTL_ADD:向多路复用实例加入一个连接socket的文件描述符
EPOLL_CTL_MOD:改变多路复用实例中的一个socket的文件描述符的触发事件
EPOLL_CTL_DEL:移除多路复用实例中的一个socket的文件描述符
fd:要操作的socket的文件描述符
event:
typedef union epoll_data {
               void        *ptr;
               int          fd;
               uint32_t     u32;
               uint64_t     u64;
           } epoll_data_t;

struct epoll_event {
               uint32_t     events;      /* Epoll events */
               epoll_data_t data;        /* User data variable */
};
events可以是下列命令的任意按位与
EPOLLIN:对应的文件描述有可以读取的内容
EPOLLOUT:对应的文件描述符有可以写入
EPOLLRDHUP:写到一半的时候连接断开
EPOLLPRI:发生异常情况,比如所tcp连接中收到了带外消息
EPOLLET:设置多路复用实例的文件描述符的事件触发机制为边沿触发,默认为水平触发
1、当多路复用的实例中注册了一个管道,并且设置了触发事件EPOLLIN,
2、管道对端的写入2kb的数据,
3、epoll_wait收到了一个可读事件,并向上层抛出,这个文件描述符
4、调用者调用read读取了1kb的数据,
5、再次调用epoll_wait


边沿触发:上面的调用结束后,在输入缓存区中还有1kb的数据没有读取,但是epoll_wait将不会再抛出文件描述符。这就导致接受数据不全,对端得不到回应,可能会阻塞或者自己关闭
因为边沿触发的模式下,只有改变多路复用实例中某个文件描述符的状态,才会抛出事件。
相当于,边沿触发方式,内核只会在第一次通知调用者,不管对这个文件描述符做了怎么样的操作

水平触发:
只要文件描述符处于可操作状态,每次调用epoll_wait,内核都会通知你

EPOLLONESHOT:epoll_wait只会对该文件描述符第一个到达的事件有反应,之后的其他事件都不向调用者抛出。需要调用epoll_ctl函数,对它的事件掩码重新设置
EPOLLWAKEUP
EPOLLEXCLUSIVE
返回值:
success:0
error:-1 errno被设置

--------------------------------------------------------------------

int epoll_wait(int epfd, struct epoll_event *events,int maxevents, int timeout);
功能:等待一个epoll队列中的文件描述符的I/O事件发生
参数:
epfd:目标epoll队列的描述符
events:用于放置epoll队列中准备就绪(被触发)的事件
maxevents:最大事件?
timeout:指定函数等待的时间。这个函数阻塞这么长一段时间之后接触阻塞。
返回值:
>=0,表示准备就绪的文件描述符个数
-1:出错,errno被设置
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

epoll多路复用-----epoll_create1()、epoll_ctl()、epoll_wait() 的相关文章

  • AIX 6.1环境 yum的安装方法

    smit使用方法介绍 因为后面会用到 所以先介绍一下smit的使用方法 输入smitty installp或smitty install 选择Install and Update Software 选择Install Software 在I
  • java打印日志时,如何对字段进行脱敏?

    在我们开发项目的时候 有些字段比较敏感 比如用户信息 这就需要在打印日志的时候对相关字段脱敏处理 本文提供的脱敏方案是使用conversionRule标签的方式 通过继承MessageConverter 在打印日志的时候对相关字段进行脱敏
  • 【RNA-seq】表达矩阵的归一化处理(RPKM,TPM,FPKM,RPM(CPM))

    在RNA seq上游的流程中 所得到的产物为表达矩阵 一般指通过RSEM HTseq等量化工具统计得到的 各个样本比对到参考基因组中各个基因的reads数 一般成为raw read count 这也是最简单的表达定量形式 但是在分析不同样本
  • Linux实现查看文件内容的多种方式

    目录 1 more 分屏显示文件内容 2 less 文本内容查看器 3 head n 显示文件前n行到终端 4 tail n 显示文件后n行到终端 5 实现实时查看文件内容 追踪文件 除了使用vi vim 编辑器查看文件内容和使用cat命令
  • python + selenium 爬淘宝登录

    淘宝的反爬虫机制如果更强大那么该文章方法也没用了 记录于2023 08 07 from selenium import webdriver from selenium webdriver common by import By from s
  • react路由动画跳转,猛练自然强

    react路由动画跳转 1 先在react项目中下载一个css第三方库 用npm或者yarn 第三方库下载 npm install animate css save yarn add animate css 2 在react组件中引用这个c
  • chatgpt赋能python:Python开发的SEO应用

    Python开发的SEO应用 搜索引擎优化 SEO 已经成为每个网站所有者需要考虑的重要因素之一 随着搜索引擎算法的不断变化和演进 我们需要确保我们的网站能在各种搜索引擎中进行良好的排名 Python作为一门强大的编程语言 已经被广泛用于S
  • linux centos 7 恶搞不停重启以及问题解决

    centos 7 恶搞不停重启以及问题解决 一 基础知识 1 运行级别的介绍 首先 CentOS系统有7个运行级别 runlevel 如下 运行级别0 系统停机状态 系统默认运行级别不能设为0 否则不能正常启动 运行级别1 单用户工作状态
  • ADB 用法大全

    基本用法 命令语法 adb 命令的基本语法如下 adb d e s
  • Java时间操作定义类

    类描述 时间操作定义类 public class DateUtils extends PropertyEditorSupport 各种时间格式 public static final SimpleDateFormat date sdf ne
  • libvirt安装过程

    libvirt安装过程 下载libvirt 0 8 1 tar gz 解压该文件 tar zxvf libvirt 0 8 1 tar gz 解压完成后进入到文件夹 libvirt 0 8 1开始安装 1 configure 2 此时提示缺
  • 笔记本电脑无法连接网络并在网络状态中显示ipv4和ipv6无网络访问权限

    win10电脑连不上网首先先右键无线或者网线那个图标 然后点击打开网络和共享中心 找到并点击连接 进入以太网或者wifi状态 看ipv4连接后面是否显示的是无网络访问权限 如果是 请按以下步骤操作 在桌面按WIN R输入CMD点击确定 打开
  • Docker部署Canal

    Canal Canal是阿里开源的一款基于Mysql数据库binlog的增量订阅和消费组件 通过它可以订阅数据库的binlog日志 然后进行一些数据消费 如数据镜像 数据异构 数据索引 缓存更新等 相对于消息队列 通过这种机制可以实现数据的
  • Windows10+CUDA+Tensorflow-gpu安装。装了一个星期,啥问题都见过了。(eg: ImportError: DLL load failed)

    目录 1 CUDA 卸载 2 中间出现的问题 2 1 问题1 This graphics driver could not find compatible graphics hardware You may continue install
  • 畸形报文单包攻击检测防御原理

    Ping of Death攻击 路由器对包的大小是有限制的 IP报文的长度字段为16位 即IP报文的最大长度为65535 如果遇到大小超过65535的报文 会出现内存分配错误 从而使接收方的计算机系统崩溃 攻击者只需不断的通过Ping命令向
  • 源代码中有什么

    在过去 源代码是核心机密 优秀的软件工程师在在某个公司的黑屋子里写程序 我们只能看到发布的产品 但是在今天 开放源代码成为一种开发方式 高手们在开源社区发布他们的代码 我们也终于有机会一睹大师高手们的源程序了 我们可以很容易地从网上下载到各
  • Kubeflow Pipeline - 构建自定义的 Workflow

    文章目录 1 Overview 2 Steps 2 1 理解 component 和 pipeline 2 2 Python SDK 构建 component 和 pipeline 2 3 上传 pipeline 3 Summary 1 O
  • 亮度、对比度与饱和度

    亮度是指图片的明暗程度 对比度是指图片明暗的差异 饱和度则是图片颜色的饱满程度 图片文件一般是RGB格式 当然也有的是YCBR格式 前者主要用于显示 后者则主要用于印刷 当然世上没有绝对的事情 也有人喜欢在电脑或手机上看YCBR格式的 至于

随机推荐

  • 消息队列-msgget

    msgget 获取系统V消息队列标识符 获取消息队列的id 头文件 include
  • 动态规划——JavaScript

    目录 什么是动态规划 怎么用动态规划 动态规划经典例题 斐波那契数 题目描述 思路 代码 爬楼梯 题目描述 思路 代码 不同路径 题目描述 思路 例题 不同路径 打家劫舍 打家劫舍 买卖股票的最佳时期 买卖股票的最佳时期 使用最小花费爬楼梯
  • 【STM32】keil环境下移植cJSON

    前言 由于工作需要 需要在STM32上使用Json 所以把一个JSON库移植到了STM32 keil MDK 实际上keil已经有了JSON扩展包 Jansson 只需要从keil官网上下载JSON Pack再导入就行 有兴趣的可以看这篇文
  • SQLi Labs Lesson22

    Lesson 22 Cookie Injection base64 encoded Double quotes 用admin账号登陆后 查看cookie 发现cookie为 YWRtaW4 有了上一节的经验 admin的base64编码为
  • 接口型模式之Bridge(桥接)模式

    1 如果你期望将实现与抽象相分离以便二者独立演化 可使用Bridge 桥接 模式 2 举例 抽象平台 public abstract class ImpLog public abstract void execute String msg
  • google v8 编译 运行遇到的问题

    环境 window os window sdk 10 vs2017 方法 官网提供的方法 https github com v8 v8 wiki Building from Source 问题1 cmd中执行命令时 tools dev v8
  • mysql_pycharm连接虚拟机上的mysql

    虚拟机上的系统是ubuntu 16 04 LTS 关于虚拟机安装mysql 5 7 参考以下的连接 Ubuntu安装Mysql 5 7 安装成功之后 执行赋予局域网可以访问虚拟机上的mysql mysql gt GRANT ALL PRIV
  • 网站工作原理,你搞懂了吗?

    网站工作原理 你搞懂了吗 网站工作原理 输入网站地址 按下回车会发生啥 1 DNS解析 2 TCP连接 2 1 TCP介绍 3 发送HTTP请求 3 1 HTTPS协议 3 2 HTTPS过程 3 3 HTTP请求 4 服务器处理请求并返回
  • 用户多设备多账户同时在线场景、匿名用户行为同步到注册用户

    TOC随着移动设备的普及和社交媒体的发展 用户在多个设备上同时访问同一个应用成为了一种常见的现象 这些设备可能属于同一个用户 也可能属于不同的用户 而且有些用户可能没有注册账户 只是以匿名的方式访问应用 在这种多设备 多账户 匿名用户同时在
  • vue动态合并行

    这个 处理数据 将表格数组传入 在获取到数组时调用 getSpanArr data this spanArr for var i 0 i lt data length i if i 0 this spanArr push 1 空数组 用来记
  • Linux下生成patch和打patch

    通过diff工具生成补丁 patch工具打上补丁 在使用diff之前 你需要保留一份未修改过的源码 然后在其它地方修改源码的一份拷贝 diff对比这两份源码生成patch 修改过的源码必须保留原来的文件名 例如 如果你修改源码中的a c文件
  • chinesecalendar 模块判断节假日

    chinesecalendar是python 中判断date类型的日期是工作日 还是节假日 比较准确地模块 先安装该模块 pip install chinesecalendar 导入模块的用法如下 import datetime from
  • PowerShell 基本知识

    常见的 powershell 攻击工具 PowerSploit powershell 后期漏洞利用框架 常用于信息探测 特权提升 凭证窃取 持久化等操作 Nishang 基于 PowerShell 的渗透测试专用工具 集成了框架 脚本和各种
  • Android 自定义控件+下拉选择框实现

    自定义控件 下拉选择框实现 当系统自带的控件不能满足我们的需求 而我们又会经常使用到 这个时候我们就可以自定义控件 下拉框是我们在做项目中经常会需要用到的 上图就是一个自定义的控件 点击显示下拉框进行选择 pop view xml 自定义控
  • docker-compose 部署JavaWeb

    目录结构 1 迅雷提取上面tar文件包 里面有一个项目 别TM反编译我的项目 链接 https pan xunlei com s VNDqngi2KD6Go2SmYGZiAizjA1 pwd b2w5 提取码 b2w5 2 搭建Linux
  • linux后台启动seata,yearning

    1 yearning nohup Yearning run b 8 142 131 56 p 9000 gt opt yearning log yearning log 2 gt 1 2 seata nohup sh seata serve
  • Vue项目部署到Linux服务器

    首先用到一个软件为finalshell 下面是我的百度网盘文件 永久有效嗷 链接 https pan baidu com s 1fUPI1RtHwTsvbfqctO1WDw 提取码 ymme FinalShell 简介 FinalShell
  • mysql 主从 mysqldump_MySQL5.7基于mysqldump的主从复制

    1创建账号 创建用于复制的账号 GRANT REPLICATION SLAVE ON TO repl 192 168 1 IDENTIFIED BY PASSWORD repl4salve 创建用于监控的账号 grant replicati
  • javascript模块化理解(通俗易懂)

    http www ruanyifeng com blog 2012 10 javascript module html http www ruanyifeng com blog 2012 10 asynchronous module def
  • epoll多路复用-----epoll_create1()、epoll_ctl()、epoll_wait()

    include