I/O复用函数,poll和epoll的用法与select、poll、epoll的区别
1.poll的接口介绍
poll系统调用和select类似,也是在指定时间内轮询一定数量的文件描述符,已测试其中是否有就绪者。poll的原型如下:
# include <poll.h> int poll(struct pollfd*fds,nfds_t nfds,int timeout); poll系统调用成功返回就绪文件描述符的总数,超时返回0,失败返回-1 nfds参数指定被监听事件集合fds的大小。 timeout参数指定poll的超时值,单位是毫秒, timeout 为-1 时, poll 调用将永久 阻塞,直到某个事件发生, timeout 为 0 时, poll 调用将立即返回。 fds 参数是一个 struct pollfd 结构类型的数组,它指定所有用户感兴趣的文件描述 符上发生的可读、可写和异常等事件。 pollfd 结构体定义如下: struct pollfd {int fd; // 文件描述符short events; // 注册的关注事件类型short revents; // 实际发生的事件类型,由内核填充 }; 其中, fd 成员指定文件描述符, events 成员告诉 poll 监听 fd 上的哪些事件类型。 它是一系列事件的按位或, revents 成员则有内核修改,通知应用程序 fd 上实际发 生了哪些事件。事件POLLIN,描述:数据可读
2.epoll的接口介绍
epoll 是 Linux 特有的 I/O 复用函数。它在实现和使用上与 select、 poll 有很大差异。首
先, epoll 使用一组函数来完成任务,而不是单个函数。其次, epoll 把用户关心的文件描述
符上的事件放在内核里的一个事件表中。从而无需像 select 和 poll 那样每次调用都要重复传
入文件描述符或事件集。但 epoll 需要使用一个额外的文件描述符,来唯一标识内核中的这
个事件表。 epoll 相关的函数如下:
epoll_create()用于床建内核事件表epoll_ctl()用于操作内核事件表
epoll_wait()用于在一段超时间内等待一组文件描述符上的事件
# include <sys/epoll.h> int epoll_create(int size); //epoll_create()成功返回内核事件表的文件描述符,失败返回-1 //size 参数现在并不起作用,只是给内核一个提示,告诉它事件表需要多大。 //int epoll_ctl(int epfd,int op,int fd,struct epoll_event*event); epoll_ctl()成功返回 0,失败返回-1 //epfd 参数指定要操作的内核事件表的文件描述符 //fd 参数指定要操作的文件描述符 //op 参数指定操作类型:EPOLL_CTL_ADD 往内核事件表中注册 fd 上的事件EPOLL_CTL_MOD 修改 fd 上的注册事件EPOLL_CTL_DEL 删除 fd 上的注册事件 //event 参数指定事件,它是 epoll_event 结构指针类型 int epoll_wait(int epfd,struct epoll_event*events,int maxevents,int timeout); //epoll_wait()成功返回就绪的文件描述符的个数,失败返回-1,抄实返回0 //epfd 参数指定要操作的内核事件表的文件描述符 //events 参数是一个用户数组,这个数组仅仅在 epoll_wait 返回时保存内核检测到 的所有就绪事件,而不像 select 和 poll 的数组参数那样既用于传入用户注册的事 件,又用于输出内核检测到的就绪事件。这就极大地提高了应用程序索引就绪文件 描述符的效率。 //maxevents 参数指定用户数组的大小,即指定最多监听多少个事件,它必须大于 0 //timeout 参数指定超时时间,单位为毫秒,如果 timeout 为 0,则 epoll_wait 会立即 返回,如果 timeout 为-1,则 epoll_wait 会一直阻塞,直到有事件就绪。2.1 LT和ET模式
epoll对文件描述符有两种操作模式:LT模式和ET模式。LT模式是默认工作模式。当epoll内核事件表中注册一个文件描述符上的EPOLLET事件时,epoll将以高效的ET模式来操作该文件描述符。
对于LT模式操作的文件描述符,当epoll_wait检测到其上有事物发生并将此事通知应用程序后,应用程序可以不立即处理该事物。这样,当应用程序下一次调用epoll_wait时,还会再次向应用程序通告此事件,直到该事件被处理。
对于ET模式操作的文件描述符,当epoll_wait检测到其上有事件,并将此事件通知应用程序后,应用程序必须立即处理该事件,因为后续的epoll_wait调用将不再向应用程序通知这一事件。所以ET模式在很大程度上降低了同一个epoll事件被重复触发的次数,因此效率该与LT模式。
epoll实现tcp服务器代码如下:
设置文件为非阻塞模式
void SetNoWait(int fd) {int old_option=fcntl(fd,F_GETFL);int new_option=old_option|O_NONBLOCK;fcntl(fd,F_SETFL,new_option); }关闭客户端连接
void CloseClient(int epfd, int fd) {close(fd);if (epoll_ctl(epfd, EPOLL_CTL_DEL, fd, NULL) == -1){printf("epoll_ctl del error\n");} }获取一个新的客户端连接,如果 flag 为 ET,则以 ET 模式处理此客户端
void GetClientLink(int sockfd, int epfd, int flag) {struct sockaddr_in caddr;socklen_t len = sizeof(caddr);int c = accept(sockfd, (struct sockaddr*)&caddr, &len);if (c < 0){printf("Client Link error\n");return;}struct epoll_event ev;ev.data.fd = c;if (flag){ev.events = EPOLLIN | EPOLLRDHUP | EPOLLET;SetNoWait(c);}else{ev.events = EPOLLIN | EPOLLRDHUP;}if (epoll_ctl(epfd, EPOLL_CTL_ADD, c, &ev) == -1){printf("epoll_ctl add error\n");}} }
相关文章:
I/O复用函数,poll和epoll的用法与select、poll、epoll的区别
1.poll的接口介绍 poll系统调用和select类似,也是在指定时间内轮询一定数量的文件描述符,已测试其中是否有就绪者。poll的原型如下: # include <poll.h> int poll(struct pollfd*fds,nfds_t nfds,int timeout); poll系统调用成功返回就…...
大数据周会-本周学习内容总结011
开会时间:2023.04.23 15:00 线下会议 目录 01【spark】 02【es同步mysql】 03【下周任务】 01【spark】 尚硅谷大数据技术Spark教程-笔记01【Spark(概述、快速上手、运行环境、运行架构)】尚硅谷大数据技术Spark教程-笔记02【SparkCore&am…...
常见的NoSQL数据库介绍
目录 一、NoSQL概述 二、为什么用NoSQL 三、NoSQL特点 四、NoSQL的分类 五、NoSQL适用场景 六、NoSQL不适用场景 一、NoSQL概述 NoSQL(NoSQL Not Only SQL ),意即“不仅仅是SQL”,泛指非关系型的数据库。 NoSQL 不依赖业务逻辑方式存储…...
记录安装Nodejs和HBuilderX搭建、部署微信小程序开发环境(一)
文章目录 1 前言2 注册小程序账号3 安装微信开发者工具4 安装Nodejs和HBuilderX4.1 windows用户安装Nodejs4.2 macos/linux用户安装Nodejs4.3 安装HBuilder X 5 创建项目5.1 新建一个项目5.2 进行基本配置 6 HBuilderX同步微信开发者工具6.1 打开服务端口6.2 调用微信开发者工具…...
(一)pyahocorasick和marisa_trie,字符串快速查找的python包,自然语言处理,命名实体识别可用的高效包...
Pyahocorasick Pyahocorasick是一个基于AC自动机算法的字符串匹配工具。它可以用于快速查找多个短字符串在一个长字符串中的所有出现位置。Pyahocorasick可以在构建状态机时使用多线程,从而大大加快构建速度。 安装Pyahocorasick Pyahocorasick可以使用pip命令进行安…...
基于Java+SpringBoot+vue+element驾校管理系统设计和实现
基于JavaSpringBootvueelement驾校管理系统设计和实现 博主介绍:5年java开发经验,专注Java开发、定制、远程、指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源码联系方式 …...
Unity中值类型和引用类型及使用时的注意事项
什么是值类型,什么是引用类型,Unity中值类型有哪些,引用类型有哪些,使用时需要注意些什么? 一、值类型和引用类型的概念 A. 值类型 值类型是指变量直接存储其值的数据类型,变量的值被保存在栈中࿰…...
PM510V16 3BSE008358R1嵌入式卡件用于励磁系统多用于工业发电
PM510V16 3BSE008358R1嵌入式卡件用于励磁系统多用于工业发电 物联网与工业自动化控制系统的联系 当今,物联网可谓是在各大媒体出镜率最高、而且与“智能”联系密切的名词之一。从“管理、控制、智能”的角度来看,其实物联网与工业自动化是一脉相承的…...
AI 这是要杀疯啦!
ChatGPT 是基于 GPT 系列大模型开发出来的一个对话场景的 Demo,它已经让我们见识到了大模型的威力。 但有些开发者的胃口不满足于此,已经开始尝试“突破” AI 的边界了,本文推荐 5 个人工智能的开源项目。其中前两个项目,让人细思…...
【精品示例】超实用Python爬虫入门实例——做一个优质舔狗
引言 最近发现了一个有意思的网站,里面充斥了大量的舔狗箴言。作为一个爬虫发烧友怎么能错过此等机会,咱们直接就是上才艺! 类的编写 本次爬虫使用了多协程的方案进行,保证了爬虫的速度。在这里我们新建一个爬虫类,…...
TCP流量控制与拥塞控制
什么是流量控制 一条TCP连接的每一侧主机都为该连接设置了接收缓存。当该TCP连接接收到正确的、有序的报文段,就会将数据放入接收缓存。相关联的应用会从缓存中读取数据。 如果发送者发送数据过快、过多,而接收方的应用程序从缓冲区读取的速度较慢&…...
Java_异常
Java_异常 1.什么是异常 生活中的异常:感冒发烧、电脑蓝屏、手机死机等。 程序中的异常:磁盘空间不足、网络连接中断、被加载的资源不存在等。 程序异常解决办法:针对程序中非正常情况,Java语言引入了异常࿰…...
自动化工具 接口自动化测试引擎
一、前言: 1、解决痛点:接口自动化测试用例需要人去开发、去维护。 2、实现第一性原理:根据定义的测试策略自动生成接口测试用例。 二、引擎优势: 1、提升人效:降低传统方式中接口测试开发与维护的工作量。 2、覆盖更…...
十三、详解Kubernetes的存储管理器
Kubernetes是一个开源的容器编排系统,它可以自动化地管理容器的部署、扩展和运维。在Kubernetes中,存储管理器是一个重要的组件,它负责管理容器的存储资源,包括持久化存储和临时存储。 Kubernetes的存储管理器主要有以下几个功能: 提供持久化存储:Kubernetes的存储管理器…...
java版 工程管理系统源码之提高工程项目管理软件的效率
高效的工程项目管理软件不仅能够提高效率还应可以帮你节省成本提升利润 在工程行业中,管理不畅以及不良的项目执行,往往会导致项目延期、成本上升、回款拖后,最终导致项目整体盈利下降。企企管理云业财一体化的项目管理系统,确保…...
VMware 安装 MS-DOS7.10 并配置网络
VMware 安装 MS-DOS7.10 并设置软盘共享 1. 新建虚拟机2. 开机2.1. 这几个地方都可以开机2.2. 手速慢,进不了BIOS的朋友可以点这里 安装 MS-DOS7.101. 先选 1 安装 MS-DOS7.10 回车2. 欢迎页面,客气一下而已,继续 Next3. 继续王婆卖瓜4. 这步…...
嵌入式51单片机04-矩阵按键系列
文章目录 矩阵按键一、矩阵按键基础知识二、矩阵按键系列代码1. 矩阵按键操作(显示数字)(1)仿真电路图(2)源代码(3)实验结果 2. 矩阵按键操作(控制数码管)&am…...
某安全对抗行走APP逆向分析
1.定位url 抓包: https://api5.xxxx.com/xxx-rest-service/message/fun_getnearby 看一下参数: opentime:时间戳 reqdata:base64编码 sign 未知,需要解密 # -*- coding: utf-8 -*- # @Author : Codeooo # @Time : 2022-10-14import frida, sysm199a = "&qu…...
数据库基础篇 《11.数据处理之增删改》
目录 1. 插入数据 1.1 实际问题 1.2 方式1:VALUES的方式添加 1.3 方式2:将查询结果插入到表中 2. 更新数据 3. 删除数据 4. MySQL8新特性:计算列 5. 综合案例 6. 课后练习 练习1 练习2 1. 插入数据 1.1 实际问题 解决方式&#x…...
IDEA插件-MavenHapler
1.安装Maven Helper Maven Helper 是 IntelliJ IDEA 中的一个插件,可以帮助您管理 Maven 依赖项。它可以帮助您更容易地删除不再需要的依赖项,查看依赖项的冲突,以及执行其他有关 Maven 依赖项的操作。 打开 IDEA 设置页面: 在插…...
PS 图片模糊修复教程:4 种方法,一键变高清
在日常设计、摄影后期、电商运营等场景中,模糊图片往往会严重影响观感与使用效果——无论是拍摄时的对焦失误、低分辨率素材的压缩失真,还是老照片的模糊褪色,都需要快速恢复清晰度。本文整理4种超实用的图片清晰化方法,涵盖PS原生…...
长期项目使用Taotoken聚合API的稳定性与容灾感受
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 长期项目使用Taotoken聚合API的稳定性与容灾感受 1. 项目背景与接入初衷 我们团队负责一个面向内部用户的中型知识问答系统&#…...
具身智能:软件测试从业者的新赛道
当软件测试的触角还在数字世界里深耕代码逻辑、验证功能完整性时,具身智能正以“AI实体”的姿态,打破虚拟与现实的边界,为测试行业开辟出一片全新的疆域。作为软件测试从业者,理解具身智能的技术内核、发展现状与未来趋势…...
避开DSP28335内存管理的坑:堆、栈、CMD文件配置全解析与最佳实践
DSP28335内存管理深度优化:从堆栈原理到CMD文件实战配置 在嵌入式系统开发中,内存管理往往是决定项目成败的关键因素之一。对于基于TI C2000系列DSP28335的开发者而言,合理规划有限的内存资源不仅能提升系统性能,更能避免那些难以…...
OpenAvatarChat终极指南:5分钟打造你的专属AI数字人
OpenAvatarChat终极指南:5分钟打造你的专属AI数字人 【免费下载链接】OpenAvatarChat 项目地址: https://gitcode.com/gh_mirrors/op/OpenAvatarChat 想象一下,你正在开发一个智能客服系统,需要让数字人能够自然流畅地与用户对话。传…...
RNA-seq公司推荐
RNA-seq公司推荐 伯远生物是国内高通量测序综合性服务商,聚焦RNA-seq全场景服务,覆盖临床、科研、农业等领域,提供一站式测序与分析解决方案; 其临床转化与大样本服务市占率领先,依托自研平台实现高通量、成本可控&…...
ops-rand:AI 训练中的随机数生成
AI 训练离不开随机数。权重初始化要随机、Dropout 要随机、数据打乱要随机、噪声注入要随机。每一次随机操作的背后,都有一组随机数生成器在工作。 CANN 的 ops-rand 仓库提供了 NPU 上的随机数生成算子——Dropout、随机 Shuffle、随机初始化、正态分布采样等。这…...
MPV_lazy:Windows用户必备的终极视频播放体验提升指南
MPV_lazy:Windows用户必备的终极视频播放体验提升指南 【免费下载链接】mpv_PlayKit 🔄 mpv player 播放器折腾记录 Windows conf | 中文注释配置 汉化文档 快速帮助入门 | mpv-lazy 懒人包 Win11 x64 config | 着色器 shader 滤镜 filter 整合方案 项…...
别再死记硬背了!用Wireshark抓包带你搞懂PPPoE的Discovery、Session、Terminate三阶段
用Wireshark透视PPPoE全流程:从Discovery到Session的实战诊断手册 当你面对一台华为路由器,PPPoE拨号配置看似完美却频繁出现认证超时,或是NAT转换后外网访问时断时续,传统的命令行检查往往只能告诉你"哪里出错"&#x…...
Chrome-Charset:3步彻底解决网页乱码问题,告别天书般的浏览体验![特殊字符]
Chrome-Charset:3步彻底解决网页乱码问题,告别天书般的浏览体验!🚀 【免费下载链接】Chrome-Charset An extension used to modify the page default encoding for Chromium 55 based browsers. 项目地址: https://gitcode.com/…...
