关于linux中select 方法延迟问题-----当我while select 后

Linux 内核 5.15+ 下 select/poll/epoll 性能对比:100万连接压测数据 本文深入分析了Linux内核5.15+下select、poll和epoll三种IO复用模型在百万连接压测中的性能表现。通过详实的测试数据对比,揭示了epoll在连接建立速率、延迟控制和资源消耗方面的显著优势,为高并发服务器开发提供了关键优化建议。 阅读详情

笔者在写程序的时候,发现了select方法真的是非常奇妙,当我们读某一个串口数据,并且要有超时机制的时候,用select方法就可以时间,或者也可以用time(NULL)来计时实现,我们今天只探讨用select方法。

我们来看看程序:

/*-----------------------------------------------------------------------------
  函数名:      serial_read
  参数:        int fd,char *str,unsigned int len,unsigned int timeout
  返回值:      在规定的时间内读取数据,超时则退出,超时时间为ms级别
  描述:        向fd描述符的串口接收数据,长度为len,存入str,timeout 为超时时间
 *-----------------------------------------------------------------------------*/
int serial_read(int fd, char *str, unsigned int len, unsigned int timeout)
{
	fd_set rfds;
	struct timeval tv;
	int ret;								//每次读的结果
	int sret;								//select监控结果
	int readlen = 0;						//实际读到的字节数
	char * ptr;

	ptr = str;							//读指针,每次移动,因为实际读出的长度和传入参数可能存在差异

	FD_ZERO(&rfds);						//清除文件描述符集合
	FD_SET(fd,&rfds);					//将fd加入fds文件描述符,以待下面用select方法监听

	/*传入的timeout是ms级别的单位,这里需要转换为struct timeval 结构的*/
	tv.tv_sec  = timeout / 1000;
	tv.tv_usec = (timeout%1000)*1000;

	/*防止读数据长度超过缓冲区*/
	//if(sizeof(&str) < len)
	//	len = sizeof(str);


	/*开始读*/
	while(readlen < len)
	{
		sret = select(fd+1,&rfds,NULL,NULL,&tv);		//检测串口是否可读

		if(sret == -1)										//检测失败
		{
			perror("select:");
			break;
		}
		else if(sret > 0)									//检测成功可读
		{
			ret = read(fd,ptr,1);
			printf("sec: %d,usec: %d\n",tv.tv_sec,tv.tv_usec);
			if(ret < 0)
			{
				perror("read err:");
				break;
			}
			else if(ret == 0)
				break;

			readlen += ret;									//更新读的长度
			ptr     += ret;									//更新读的位置
		}
		else													//超时
		{
			printf("timeout!\n");
			break;
		}
	}

	return readlen;
}
一目了然,计时从fd这个设备描述符读取数据,读入的数据存入str中,长度为len,超时时间为timeout。

这里大家一定会很奇怪,为什么我要一个个字节的读出数据?这个函数原来也不是笔者写的,是参照一个大牛的写法,我一开始也没明白,后来终于明白:因为要超时!

tv这个参数,会在记录调用了select后消耗的时间,这样当我每次while循环的时候,就可以检测并且记录tv还剩多少时间能让我消耗,若tv的值为0了,那么就是超时了。

打开串口,我们来看看运行结果:

可以看到我从串口输入了11个数据,每传入一个字节的数据大概耗时70us

(笔者输入的是i love you ,但是原先输入了多次i love you linux and unix and meego缓冲区没有清除,35个字节太长没有办法截图,谅解~~~)

如此就可以实现超时读数据,select方法原来还有这样用,我也是刚刚发现,和大家分享!

select/poll/epoll 性能对比:Linux 下 3 种 I/O 多路复用方案实测与选型指南 本文深入对比了Linux下select、poll和epoll三种I/O多路复用技术的性能差异,通过百万连接压测实验和工程实践案例,揭示了epoll在高并发场景下的显著优势。文章提供了详细的选型指南和优化技巧,帮助开发者根据实际需求选择最适合的I/O多路复用方案。 阅读详情

相关推荐

手写生产级TCP Socket通信骨架:从阻塞到select的实战指南

TCP Socket是网络编程的底层基石,其核心在于字节流传输、连接状态管理与系统资源控制。理解TCP粘包原理、TIME_WAIT机制、SO_REUSEADDR语义及非阻塞I/O模型,是构建高可靠通信服务的前提。这些技术直接决定边缘计算、物联网网关和低延迟中间件等场景下的连接稳定性与吞吐表现。本文聚焦真实生产环境——树莓派+Linux+Python组合,详解如何用原生socket写出可压测、可排障、可运维的TCP服务骨架,覆盖bind/listen/accept生命周期、recv循环边界处理、connect

aiqixiao2017的博客 382

IO复用学习笔记

1--概念: IO即为网络I/O,多路即为多个TCP连接,复用即为共用一个线程或者进程,模型最大的优势是系统开销小,不必创建也不必维护过多的线程或进程。 2--IO两个阶段IO过程分两阶段: 数据准备阶段。从设备读取数据到内核空间的缓冲区 内核空间复制回用户空间进程缓冲区阶段发生IO的时候: 内核从IO设备读数据(例如:淘米,把米放在饭锅里煮饭)进程从内核复制数据(盛饭,从内核这个饭锅里把饭装到碗里来); 系统调用----read函数。 IO多路...

weixin_42145502的博客 4783

现代C++封装inotify与select实现高效文件监控方案

文件系统监控是Linux开发中的常见需求,传统轮询方案实时性差且资源消耗大。inotify作为内核提供的事件驱动机制,能够高效监控文件变化并即时通知应用。结合I/O多路复用技术如select,可以实现单线程同时监控多个文件描述符,构建非阻塞的异步事件处理模型。这种方案在现代C++工程实践中,通过RAII机制和类型安全封装,将底层系统调用转化为安全易用的高级抽象,广泛应用于日志分析、配置热重载等场景。本文深入探讨了如何利用select与inotify实现一套符合现代C++设计哲学的文件监控组件,涵盖核心封装、

weixin_30258901的博客 407

select函数用法详解,及实例分析

select函数是系统调用函数,用于多路监控。当没有一个文件满足要求时,select将阻塞调用进程。在有些情况下,采用select函数可以大大简化程序结构。比如一个系统有10个输入设备,如果想实时读取这10个设备的输入数据,就比较困难,采用查询方式,显然达不到实时的目的;或者可以为每一个设备设计一个线程,每个线程实时对设备的输入进行读取,这样会使程序异常复杂,数据的交互也很混乱。有...

bigmarshal的博客 1万+

VNC协议优化:实现零延迟远程控制的技术解析

远程控制协议如VNC(Virtual Network Computing)是实现跨平台屏幕共享与输入控制的核心技术,其底层基于RFB(Remote FrameBuffer)协议。传统实现常面临网络传输、渲染效率与协议冗余三大瓶颈,导致操作延迟显著。通过混合传输协议(UDP+TCP)、动态区域检测与GPU加速压缩等优化手段,可大幅降低延迟至30ms以内。这类优化在工业控制、远程医疗等实时性要求高的场景中尤为重要,其中树莓派等嵌入式设备的部署验证显示,协议层优化比单纯增加带宽更能提升用户体验。热词“零延迟”和“

weixin_30627341的博客 380

FD_SET 与 select() 性能陷阱:从 1024 文件描述符限制到 epoll 迁移指南

本文深入剖析了 `select()` 系统调用在高并发场景下的性能陷阱,包括 `FD_SET` 的1024文件描述符限制和线性扫描的性能损耗,并通过实测数据对比展示了 `epoll` 架构的显著优势。文章提供了从 `select()` 迁移到 `epoll` 的完整指南,包括代码结构改造、边缘触发模式注意事项和高级优化技巧,帮助开发者提升网络应用的性能和可扩展性。

dfdfadsf3443的博客 416

Linux select函数的使用

文章目录一、select函数1.fd_set结构体FD_ZEROFD_SETFD_CLRFD_ISSET2.timeval 结构体3.返回值二、文件描述符就绪条件 一、select函数 int select ( int __nfds, //指定被监听的文件描述符总数 fd_set *__readfds, //可读事件文件描述符集合 fd_set *__writefds, //可写事件文件描述符集合 fd_set *__exceptfds, //异常事件文件描述符集合 struct timeval *__

余识- 5241

Zemax实战:20×超高清变焦镜头设计全流程解析(从架构到制造)

本文详细解析了使用Zemax软件设计一款20倍变焦比、恒定F2.8光圈8K超高清镜头的全流程。从应对恒定光圈、宽光谱与8K解析力三大挑战的初始架构规划,到构建多重组态模型、分七阶段进行像差优化与公差分析,最终跨越制造鸿沟,为广播级影视与高精度工业检测应用提供了实战指南。

sun99的博客 552

Socket超时设置---select()的妙用

http://fanqiang.chinaunix.net/a4/b7/20010913/0900001283.html【 原文由 cpu 所发表 】  用过 WinSock API 网友们知道:WinSock 编程中有一很方便的地方便是其 息驱动机制,不管是底层 API 的 WSAAsyncSelect() 还是 MFC 的异步Socket类: CAsyncSocket,都提供了诸如 FD_AC

cation的专栏 2万+

【实战指南】Jaspersoft Studio + JasperReports:从零构建企业级PDF报表

本文详细介绍了如何使用Jaspersoft Studio和JasperReports从零构建企业级PDF报表。通过可视化设计、数据连接、模板设计到最终输出的全链路支持,这套组合方案显著降低了报表开发的维护成本。文章还提供了开发环境搭建、中文乱码解决方案、Java集成代码及性能优化技巧,适合需要高效生成复杂PDF报表的开发者。

weixin_42666036的博客 247

HRnet的pytorch实现

HRnet的pytorch实现

奋土的博客 1954

select实现延时函数

select实现延时函数

1490

ArcGIS小白必看:5分钟搞定WGS_1984到Krasovsky_1940_Albers投影转换(附详细步骤)

本文为ArcGIS初学者提供了从WGS_1984地理坐标系转换到Krasovsky_1940_Albers投影坐标系的详细实战指南。文章深入剖析了投影变换与基准面转换的核心区别,通过分步详解创建自定义地理变换、执行投影等关键操作,并附带了常见问题排查与批量处理脚本,旨在帮助用户高效、准确地完成坐标系统转换,为后续空间分析奠定基础。

weixin_29305337的博客 641

select/poll/epoll 性能对比:Linux 5.15 内核下 10K 连接实测数据

本文深度评测了Linux 5.15内核下select/poll/epoll三种I/O多路复用技术在10K并发连接下的性能表现。通过实测数据对比,揭示了epoll在CPU使用率、内存占用和延迟方面的显著优势,为高并发网络服务开发提供了选型建议和优化技巧。

weixin_34009794的博客 440

一份针对零基础学习AI Agent详细学习计划

以下是针对零基础学习者制定的AI Agent详细学习计划,结合最新行业动态和实用资源推荐,帮助你从入门到进阶系统掌握核心技能

sexy19910923的博客 1905

openmediavault(OMV) (1)安装部署

EXT3(Third Extended File System): EXT3 是 Linux 中广泛使用的日志文件系统,是 EXT2 文件系统的升级版本。这里可以根据自己的需求进行设置,目前只设置了自动登出为1天,为方便后续配置使用,其他设置可根据自己的具体需求进行设置。通过cd 命令进入到我们的raid存储中,通过ls发现里面没有任何的数据,因为我们的raid存储中还未创建任何数据。我的系统要安装在100G的磁盘上,故选择100G的磁盘,实际可以根据具体情况选择。

Monster✺◟(∗❛ัᴗ❛ั∗)◞✺的博客 2168

Linux select系统调用:高并发IO处理的经典方案

IO多路复用技术是解决高并发连接的核心方案,其通过单线程监控多个文件描述符状态,大幅降低系统资源消耗。select作为Linux经典的同步IO复用系统调用,采用fd_set位图结构实现高效事件检测,特别适合连接数在1024以内的场景。在物联网网关、嵌入式设备等资源受限环境中,select方案可减少60%以上的资源占用。通过合理设置超时参数和max_fd优化,能有效平衡响应速度与CPU利用率。相比epoll等现代方案,select在跨平台兼容性和超时精度控制方面仍具独特优势,是服务端开发必须掌握的底层技术之一

weixin_33853794的博客 391

ANSYS专题-利用ANSYS SIwave进行PCB板的EMS仿真

本文详细描述了使用ANSYSSIwave进行电路板电磁敏感度(EMS)仿真的完整流程。主要步骤包括:导入AD软件生成的IPC2581文件,检查PCB叠层和电路参数,为敏感网络设置50欧姆端口并指定GND为参考网络,进行验证检查后设置频段范围和入射波类型(单/多入射、极化方式等),最后启动仿真并查看选定网络的EMS感应电压曲线。该过程提供了从文件准备到结果分析的全套操作指南,适用于评估电路板在电磁干扰环境下的性能表现。

whm128的博客 3617

深入理解 Linux epoll:为什么它比 select 快?

本文深入解析了Linux内核中epoll的工作原理,回答了开发者常见的核心问题。通过对比select的O(n)时间复杂度,指出epoll采用事件驱动机制实现O(1)高效处理。关键点包括:1) epoll维护红黑树管理监听集合和Ready List存储活跃事件;2) 通过Wait Queue回调机制直接通知状态变化,避免全量扫描;3) epoll_wait仅检查非空的Ready List;4) 事件处理慢不会丢失但会导致延迟;5) Event Loop应保持轻量,耗时业务交由线程池。文章最后总结了epoll的

左手是诗,右手是代码。 538

深入理解 HTTP 协议中的 Content-Type

是 HTTP 协议中的一个头部字段(Header),用于指示请求或响应中实体主体(body)的媒体类型(Media Type),也称为MIME 类型(Multipurpose Internet Mail Extensions)。

h a 6 6 6 c k 为 你解决复杂难题! 998

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

深入解析Linux I/O多路复用:select、poll与epoll对比

I/O多路复用是高性能网络编程的核心技术,它通过单线程监控多个文件描述符的状态变化,大幅提升系统吞吐量。从select、poll到epoll的技术演进,体现了从轮询机制到事件驱动架构的跨越。select使用位图管理描述符但存在1024限制,poll改用结构体数组突破数量限制,而epoll通过红黑树和就绪队列实现O(1)事件通知。在边缘触发(ET)模式下,epoll能更高效处理高并发场景,如Nginx等服务器软件。理解这些机制的实现原理和性能差异,对构建C10K级别的高并发服务至关重要。

weixin_33726318的博客 384

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

【C++|Linux系统编程】IO多路复用(select、poll、epoll)

三、demo2.cpp 基于Linux的文件操作 一、demo3.cpp 二、demo4.cpp socket函数详解 一、什么是协议 人与人沟通的方式有很多种:书信、电话、QQ、微信。如果两个人想沟通,必须先选择一种沟通的方式,如果一方使用电话,另一方也应该使用电话,而不是书信。 协议是网络通讯的规则,是约定。 成功,失败,。 全部网络编程的函数,失败时基本上都是返回-1,errno被设置。只要参数没填错,基本上不会失败。。( ) 三、TCP和UPD 1)TCP和UDP的区别 TCP a)TCP面向

千禧皓月的博客 713

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

【Linux】网络篇五--IO多路复用实战:从select到epoll的性能跃迁

本文深入探讨了Linux中IO多路复用技术从select到epoll的性能跃迁,通过实战对比分析展示了epoll在高并发场景下的显著优势。文章详细解析了select、poll和epoll的工作原理及性能差异,并提供了epoll的最佳实践和内核原理深度解析,帮助开发者优化网络编程性能。

361

OpenCV VideoCapture 高分辨率采集优化:规避 V4L2 select() timeout 的 4 个实践

本文深入探讨了OpenCV VideoCapture在高分辨率视频采集时遇到的V4L2 select() timeout问题,提供了4个经过验证的优化实践。从缓冲区配置、线程分离到硬件加速检查,详细解析了如何提升4K视频采集的稳定性和性能,帮助开发者有效解决视频流中断和卡顿问题。

weixin_34210740的博客 384

Python中模拟do-while的7种工程实践与避坑指南

在编程中,'先执行后判断'是一种基础控制流模式,广泛应用于用户输入验证、API重试、硬件初始化、文件轮询等场景。其核心原理是打破标准while循环‘先判后执’的约束,确保主体逻辑至少执行一次,从而满足现实系统中对首步不可跳过的语义要求。这种模式虽非Python原生语法,却因EAFP(请求宽恕优于许可)设计哲学而天然契合Python工程实践。它在数据采集、pandas清洗、requests调用、scikit-learn训练等高频任务中展现出显著的技术价值:提升鲁棒性、简化异常处理路径、增强调试可观测性。本文聚

weixin_30319153的博客 412
上一篇: Linux下ppp拨号+3G模块(evdo 中兴MC8630模块)
下一篇: [求助]socket编程一方突然断开连接,select方法失效问题
memoryjs
博客等级 码龄18年 240粉丝 113原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值