浅析epoll – epoll函数深入讲解

2023-11-10

http://www.cppfans.org/1418.html


前一篇大致讲了一下epoll是个什么东西,优点等内容,这篇延续上一篇的内容,主要是分析epoll的函数,epoll高性能的深入分析。

epoll的三大函数

1.创建epoll fd函数

1
int epoll_create ( int size ) ;

epoll_create()创建一个epoll的事例,通知内核需要监听size个fd。size指的并不是最大的后备存储设备,而是衡量内核内部结构大小的一个提示。当创建成功后,会占用一个fd,所以记得在使用完之后调用close(),否则fd可能会被耗尽。

Note:自从Linux2.6.8版本以后,size值其实是没什么用的,不过要大于0,因为内核可以动态的分配大小,所以不需要size这个提示了。

创建还有另外一个函数

1
int epoll_create1 ( int flag ) ;

这个函数是在linux 2.6.27中加入的,当你在看陈硕的muduo时可以看到这个函数,其实它和epoll_create差不多,不同的是epoll_create1函数的参数是flag,当flag是0时,表示和epoll_create函数完全一样,不需要size的提示了。

当flag = EPOLL_CLOEXEC,创建的epfd会设置FD_CLOEXEC

当flag = EPOLL_NONBLOCK,创建的epfd会设置为非阻塞

一般用法都是使用EPOLL_CLOEXEC.

Note:关于FD_CLOEXEC,现在网上好多都说的有点问题,我翻阅了一些资料,请教了一些人,大约明白它的意思了。

它是fd的一个标识说明,用来设置文件close-on-exec状态的。当close-on-exec状态为0时,调用exec时,fd不会被关闭;状态非零时则被关闭,这样做可以防止fd泄露给执行exec后的进程。关于exec的用法,大家可以去自己查阅下,或者直接man exec。

2.epoll事件的注册函数

1
int epoll_ctl ( int epfd , int op , int fd , struct epoll_event * event ) ;

select是在监听时告诉内核要监听的事件,而epoll_ctl是先注册需要监听的事件。

第一个参数epfd,为epoll_create返回的的epoll fd。

第二个参数op表示操作值。有三个操作类型,

1
2
3
4
5
EPOLL_CTL_ADD  // 注册目标fd到epfd中,同时关联内部event到fd上
 
EPOLL_CTL_MOD // 修改已经注册到fd的监听事件
 
EPOLL_CTL_DEL // 从epfd中删除/移除已注册的fd,event可以被忽略,也可以为NULL

第三个参数fd表示需要监听的fd。

第四个参数event表示需要监听的事件。

1
2
3
4
5
6
7
8
9
10
11
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 */
} ;

event参数是一个枚举的集合,可以用” | “来增加事件类型,枚举如下:

EPOLLIN:表示关联的fd可以进行读操作了。
EPOLLOUT:表示关联的fd可以进行写操作了。
EPOLLRDHUP(since Linux 2.6.17):表示套接字关闭了连接,或者关闭了正写一半的连接。
EPOLLPRI:表示关联的fd有紧急优先事件可以进行读操作了。
EPOLLERR:表示关联的fd发生了错误,epoll_wait会一直等待这个事件,所以一般没必要设置这个属性。
EPOLLHUP:表示关联的fd挂起了,epoll_wait会一直等待这个事件,所以一般没必要设置这个属性。
EPOLLET:设置关联的fd为ET的工作方式,epoll的默认工作方式是LT。
EPOLLONESHOT (since Linux 2.6.2):设置关联的fd为one-shot的工作方式。表示只监听一次事件,如果要再次监听,需要把socket放入到epoll队列中。

3.epoll等待事件函数

int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);
int epoll_pwait(int epfd, struct epoll_event *events, int maxevents, int timeout,  const sigset_t *sigmask);

上面两个函数的参数含义:

第一个参数:表示epoll_wait等待epfd上的事件

第二个参数:events指针携带有epoll_data_t数据

第三个参数:maxevents告诉内核events有多大,该值必须大于0

第四个参数:timeout表示超时时间(单位:毫秒)

epoll_pwait(since linux 2.6.19)允许一个应用程序安全的等待,直到fd设备准备就绪,或者捕获到一个信号量。其中sigmask表示要捕获的信号量。

函数如果等待成功,则返回fd的数字;0表示等待fd超时,其他错误号请查看errno

函数到这里就讲完了,下一篇会写一个例子给大家看下这些函数是如何使用的。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

浅析epoll – epoll函数深入讲解 的相关文章

  • 【linux-kali】网络模式host-only设置及注意事项

    网络模式 host only 设置 环境 kali vmware windows10 步骤 1 关闭kali系统下 虚拟机 编辑 虚拟机网络编辑器 Vmnet1 设置或确认子网IP 192 167 0 0 和DHCP范围 2 宿主机 上网网
  • linux系统配置文件

    1 etc sysconfig i18n 语言配置文件 2 etc sysconfig network scripts ifcfg eth0 eth0配置文件 3 boot grub grub conf grup配置文件 或 boot gr
  • linux系统配置文件

    1 etc sysconfig i18n 语言配置文件 2 etc sysconfig network scripts ifcfg eth0 eth0配置文件 3 boot grub grub conf grup配置文件 或 boot gr
  • 大教堂和集市--两种不同的软件开发模式 论文阅读笔记

    该博文来自 The Cathedral and the Bazaar 一文的阅读总结 再加入一些自己的理解 今天又发现网上的一个资料 可以说是对本文的一个纲领吧 大教堂与集市 维基语录 1 Given enough eyeballs all
  • AIX上的date命令和循环语句与linux上的不同

    在AIX上很多linux命令都可以通用 但是还是有很多的不同 并且有些命令其实是要安装软件才能使用的 有时候主机不是你配置的 这些东西都没有 你会发现原先你玩的很溜的命令用不了 会感到很尴尬 首先我从我自己经历来说两个遇到的问题 对玩AIX
  • MySQL8.0安装后不能正常使用的经历以及解决办法

    装了个MySQL给自己的阿里云服务器 毕竟钱不能白花要提高自己Linux上的经验 要多折腾实践蹂躏 实际上操作过程中是我被蹂躏的一方 一下才行 1 阶段1 登录不了MySQL 首先MySQL安装完成 我装的是MySQL最近版本8 0有最新的
  • linux常用命令-part2

    Ubuntu Fedora Debian CentOS中文怎么发音 有奔头 费德勒 迪扁 桑托斯 乌版图 菲朵拉 德槟 森头斯 使用find和wc命令统计代码行数 wc l find name js xargs 查看当前目录下文件的个数 l
  • 建立Tahi IPv6测试环境

    首先说一下TAHI测试的相关术语 Tester Node TN 测试平台 A tester node for the conformance tests Node Under Test NUT 待测试机 A testee node for
  • gcc编译过程理解

    GNU CC 通常称为GCC 是GNU项目的编译器 它能够编译C C 语言编写的程序 使用gcc 程序员可以对编译过程有更多的控制 编译过程分为3个阶段 预处理 汇编 链接 程序员可以再编译的任何阶段结束后停止整个编译过程以检查编译器在该阶
  • 使用FD_CLOEXEC实现close-on-exec,关闭子进程无用文件描述符

    我们经常会碰到需要fork子进程的情况 而且子进程很可能会继续exec新的程序 这就不得不提到子进程中无用文件描述符的问题 fork函数的使用本不是这里讨论的话题 但必须提一下的是 子进程以写时复制 COW Copy On Write 方式
  • linux 新建用户无 .profile 问题

    1 新建一个用户 其家目录下面默认生成什么文件由 etc skel 目录决定 就是 这个目录下面有什么新建用户后家目录就生成什么 2 新建一个用户可以由 d 参数指定家目录 如 useradd d home test u 500 g ora
  • Linux查看内存,线程 ,CPU等情况

    有的时候需要看服务器的状态 比如内存使用状态 线程 CPU使用情况等 要掌握一些linux的命令是很必要的 所以我们大致总结一下这些命令 1 内存使用情况 方法一 top命令 top命令会显示内存 CPU还有swap硬盘等状况 我们可以通过
  • Linux命令大全(手册)

    http man linuxde net
  • CMake添加gcov代码覆盖测试支持

    CMake添加gcov代码覆盖测试支持 金庆的专栏 在根CMakeList txt中添加ENABLE GCOV选项 OPTION ENABLE GCOV Enable gcov debug Linux builds only OFF IF
  • 浅析epoll – epoll函数深入讲解

    http www cppfans org 1418 html 前一篇大致讲了一下epoll是个什么东西 优点等内容 这篇延续上一篇的内容 主要是分析epoll的函数 epoll高性能的深入分析 epoll的三大函数 1 创建epoll fd
  • C语言中协程(coroutine)实现

    C语言协程库实现说明 代码实现 1 当前支持的功能概览 1 1 创建任意数量协程并在协程中yield include
  • Aix6.1下安装SWFTools

    该文章参考http tech sxinfo net jctj article do curMenu 14 childMenu 16 articleId 388 再结合我在实际上在Aix6 1上的安装经验来编写 相关文件的下载 ftp ftp
  • .c文件生成.cgi文件

    方法一 hello c文件 方法二 base h cgic c cgic h file upload c多文件同时编译
  • Linux上配置Jupyter Notebook远程访问

    本身自己机器上安装了太多东西 有点慢 本来也喜欢所有的东西搬到服务上 所以如果能安装一个远程的Jupyter 服务器 用起来就会很方便 记录下自己的安装步骤 1 安装ipython jupyter pip install ipython p
  • Linux命令学习之nslookup

    比如我想查看 一个IP地址的域名的话 可以用nslookup这个命令 test test nslookup ip address 参考 http roclinux cn p 2441 nslookup何许人 nslookup命令 是Linu

随机推荐

  • 源码(二进制)安装kuberbetes(k8s) (完整版-持续完善)

    环境配置 1 分别设置hostname hostnamectl set hostname master hostnamectl set hostname node01 hostnamectl set hostname node02 2 主机
  • 从42亿个不重复的4字节整数中判断一个数是否存在

    include
  • RuoYi项目中VUE表单修改表单中数据回显下拉选项或者单选出现异常

    若依项目中有一个功能就是字典 字典可以让我们不需要修改前端代码的情况下实现表单中下拉选项文字 单选 多选按钮的文字变更 但也会遇到各种各样的问题 后端传递的某个字段的值是数字类型的值 但是字典里面的确实字符串的值 不可能让后端传递字符串的值
  • OpenCV实现SfM(一):双目三维重建(包含SIFT特征点提取)

    三维重建介绍 三维重建是指根据基于一个视图或者多个视图所获得的物体或者场景的图像重建三维模型的过程 由于单视图的信息很单一 因此三维重建需要更复杂的算法和过程 相比之下 多视图的三维重建 模仿人类观察世界的方式 就比较容易实现 其方法是先对
  • Uni-App开发框架介绍

    Uni App开发框架介绍 1 Uni App简介 Uni App是一家公司 DCloud 产品 公司承诺将一直开源且免费 公司旗下有4个产品 HBuilder X 开发工具 uni app 跨平台统一框架 uniCloud 云服务提供商
  • 浏览器的事件轮询(消息轮询)

    目录 浏览器的进程模型 何为进程 何为线程 浏览器有哪些进程和线程 渲染主线程是如何 作的 相关问题 何谓异步 JS为什么会阻塞渲染 JS 中的计时器为什么无法精确计时 任务队列与优先级 浏览器的进程模型 何为进程 程序运 需要有它 专属的
  • 【AI with ML】第 11 章 :对序列模型使用卷积和递归方法

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • 操作系统复习【南邮】

    声明 操作系统系列只针对南邮操作系统课程重点进行梳理 尽量不要作为考研复习资料 可能会有缺失之类 也恳请读者进行批评指正 共同进步 参考教材 操作系统教程 人民邮电出版社 黄刚 徐小龙 段卫华编著 2009 9
  • ChatGPT开源系列

    目录 进化树 从GPT 4 可以看出未来 LLM 的哪些趋势 未来的研发方向和优化策略是什么 模型 Stanford Alpaca 可以借鉴的点 llama cpp 验证阶段已完成 nebullvm chatllama 待定 可以借鉴的点
  • sql注入的分类总结

    前言 之前对联合查询 报错注入 布尔盲注 延迟注入 对这几种类型模糊不定 我也查阅了一些资料 做了一点总结 希望对大家有帮助 对于SELECT语句 我们通常分其为两种情况 有回显和无回显 有回显 什么是有回显 我们举个例子当我们看到一个ur
  • typedef struct语法解释

    C语言源代码 typedef char datatype typedef struct node datatype data struct node lchild rchild bintnode typedef bintnode bintr
  • Pytest系列-快速入门和基础讲解(1)

    前言 目前有两种纯测试的测试框架 pytest和unittest unittest应该是广为人知 而且也是老框架了 很多人都用来做自动化 无论是UI还是接口 pytest是基于unittest开发的另一款更高级更好用的单元测试框架 单元测试
  • 上最简单的SpringCloud教程

    上一篇文章 讲述了如何通过RestTemplate Ribbon去消费服务 这篇文章主要讲述如何通过Feign去消费服务 一 Feign简介 Feign是一个声明式的伪Http客户端 它使得写Http客户端变得更简单 使用Feign 只需要
  • elementui中的表格实现无限滚动

    背景 找了很多资料 发现elementui中的表格需要实现无限滚动 需要下载一个插件 然后再结合elementui中的无限滚动的属性一起搭配使用 才能有实现完整的功能 在目前网上 我没有看到实现完整功能的博客文章 于是 我在结合他们的方法
  • 宏观经济学笔记

    最近在网上买了一套关于宏观经济学的简短课程 后面将课程笔记会一起放在这儿上面 今天暂时占坑
  • 射频与微波测量之S参数

    S参数 S散射也叫散射参数 是微波传输中的一组重要参数 由于我们很难在高频率时测量电流或电压 因此我们要测量散射参数或 S 参数 这些参数用来表征RF 元件或网络的电气属性或性能 与我们熟悉的测量 如增益 损耗和反射系数 有关 如上图为二端
  • [OpenAirInterface实战-10] :OAI nFAPI的软件组织结构和软件协议栈架构

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 OpenAirInterface实战 10 nFAPI的软件组织结构和软件协议栈架构 文火冰糖 王文兵 的博客 CSDN博客 目录 第1章
  • 6种微服务RPC框架,你知道几个?

    6种微服务RPC框架 你知道几个 开源 RPC 框架有哪些呢 一类是跟某种特定语言平台绑定的 另一类是与语言无关即跨语言平台的 跟语言平台绑定的开源 RPC 框架主要有下面几种 Dubbo 国内最早开源的 RPC 框架 由阿里巴巴公司开发并
  • ubuntu下opencv和opencv_contrib编译

    第一次编译之后 测试opencv example不成功 又重新卸载了再装了一次 成功了 简单记录一下 下载opencv4 6以及opencv contrib 4 6 0 opencv下载地址github opencv contrib下载地址
  • 浅析epoll – epoll函数深入讲解

    http www cppfans org 1418 html 前一篇大致讲了一下epoll是个什么东西 优点等内容 这篇延续上一篇的内容 主要是分析epoll的函数 epoll高性能的深入分析 epoll的三大函数 1 创建epoll fd