linux select函数陷阱

深入解剖 select 函数:核心参数解析与实战避坑指南 本文深入解析了跨平台网络编程函数 select 的核心机制与使用要点。select 通过内核线性扫描文件描述符集合实现单线程并发处理,其核心参数包括 nfds(扫描边界)、描述符集合(传入传出参数)和 timeout(控制阻塞行为)。文章详细介绍了四个关键宏函数(FD_ZERO、FD_SET、FD_CLR、FD_ISSET)的使用方法,并重点警示了 timeout 参数在循环中必须重置的致命坑点。最后通过一个带超时机制的服务器代码示例,展示了 select 的实际应用场景和错误处理方式,帮助开发者避开常见陷 阅读详情

代码样例一(正确用法):

while (true) {
    FD_ZERO(&readfds);
    FD_SET(socket_fd, &readfds);
    time_wait.tv_sec = 0;
    time_wait.tv_usec = 500000;

    ret = select(socket_fd+1, &readfds, NULL, NULL, &time_wait);
    if ((ret <= 0) || (!FD_ISSET(socket_fd, &readfds))) {
        continue;
    }

    // TODO: read socket
}

代码样例二(错误用法):

time_wait.tv_sec = 0;
time_wait.tv_usec = 500000;
while (true) {
    FD_ZERO(&readfds);
    FD_SET(socket_fd, &readfds);

    ret = select(socket_fd+1, &readfds, NULL, NULL, &time_wait);
    if ((ret <= 0) || (!FD_ISSET(socket_fd, &readfds))) {
        continue;
    }

    // TODO: read socket
}

select()传入的第5个参数,time_wait变量是传入的指针,select()函数内部会改变此参数的值,以供调用者获得select()的执行耗费时长。

因此,第5个参数必须每次调用select()之前重新赋值,否则会使select()函数执行阻塞时间为0。从而导致该线程一直占用cpu资源。

Linux阻塞与非阻塞IO机制及select/poll内核实现 阻塞IO与非阻塞IO是Linux系统中进程与设备交互的基础同步范式,其本质在于内核对进程状态(如TASK_INTERRUPTIBLE)的调度控制与等待队列(Wait Queue)的协同管理。阻塞模式通过睡眠-唤醒机制避免忙等待,提升CPU利用率;非阻塞模式则以-EAGAIN错误码即时反馈,将事件决策权交予用户空间。技术价值体现在高并发服务(如Nginx)、实时嵌入式驱动及POSIX兼容性保障上。典型应用场景包括串口数据接收、ADC采样等待、多设备轮询监控等。本文深入解析open()标志位切换、select( 阅读详情

相关推荐

ALSA音频开发实战:如何用snd_pcm_avail避免缓冲区溢出(附完整代码)

本文深入探讨了在ALSA音频开发中,如何利用`snd_pcm_avail`函数有效管理环形缓冲区,从而避免音频数据溢出或下溢。通过实战代码示例,详细解析了该函数在播放场景下的核心作用,即实时查询可写入的帧数,并构建了自适应写入循环以实现稳健的流量控制,确保音频流的平滑与稳定。

weixin_29183637的博客 461

Linux select入门

select用来等待信号发生,如果有信号发生,就会给用户机会处理信号。 下面的程序等待用户从键盘输入,如果没有输入,就一直等待: #include <sys/select.h> #include <sys/time.h> #include <sys/types.h> #include <unistd.h> #include <stdio.h> int main() { fd_set read_fd_set; FD_ZERO(&

C++ 爱好者 make_it_simple888 920

select跨平台(windows/linux)底层实现区别和陷阱

目的: 说到select大家可能都很熟悉了,但是在使用过程中还是会有一些比较隐蔽的坑,这篇文章主要是讲一下在使用select实现跨平台通讯库组件的过程中,遇到的因为不同平台(windows、linux)间select底层实现差异导致一个莫名其妙崩溃。 问题描述: linux平台用select实现的网络通讯库在高并发的情况下莫名其妙的崩溃,windows平台却没有任何问题,经过阅读linux fd_set数据结构找到了答案,描述如下: windows、linux平台fd_set数据结构: 1 windows平

wangrenhaioylj的博客 1097

_正点原子Linux第五十二章Linux阻塞和非阻塞IO实验

1)资料下载:点击资料即可下载2)对正点原子Linux感兴趣的同学可以加群讨论:9354467413)关注正点原子公众号,获取最新资料更新第五十二章Linux阻塞和非阻塞IO实验 阻塞和非阻塞IO是Linux驱动开发里面很常见的两种设备访问模式,在编写驱动的时候一定要考虑到阻塞和非阻塞。本章我们就来学习一下阻塞和非阻塞IO,以及如何在驱动程序中处理阻塞与非阻塞,如何在驱动程序使用等待队列和poll...

weixin_39732316的博客 363

低功耗模式下的看门狗使用

最近用国产芯片AT32在做一个低功耗的项目,为了实现低功耗模式下的定时唤醒,我选择的是使用相对比较简单的看门狗来做,下面就分享一下使用过程~ 为了最大限度的降低功耗,我用的是待机模式,先看看几种低功耗模式以及唤醒的区别: 而看门狗AT32提供了两种,分别是独立看门狗(IWDG)和窗口看门狗(WWDG),其区别大概有以下几点: 1、独立看门狗(IWDG)由专用的低速时钟(LSI)驱动,即使主时钟发生故障它也仍然有效;窗口看门狗由从 APB1 时钟分频后得到的时钟驱动,通过可配置的时间窗口来检测应用程序非正常

dc18883988396的博客 3028

隐语第四课:快速上手-SecretFlow的安装和部署

隐语课程,继续学习隐私计算技术

weixin_41467180的博客 2509

select 函数详解

Unix系统下解释: 函数原型:intselect(int maxfdp, fd_set* readfds, fd_set* writefds, fd_set* errorfds, struct timeval* timeout); select函数的主要用途是什么?select函数是一个监控函数,用来监控插口的状态!插口就是指的是文件描述符,Unix / Linux一切皆文件。 select函数能够监控插口状态,如下表: 具体解释select的参数: 先解释第五个参数(最后一个参数):st.

m0_50668851的博客 7279

实战指南:CentOS 7下VOS3000 8.0从零部署到授权激活全流程

本文提供了一份详尽的CentOS 7系统下部署VOS3000 8.0的实战指南。从环境准备、使用FileZilla上传安装包、执行自动化安装脚本,到获取软件码、利用注册机生成授权文件并激活,手把手带领用户完成从零部署到投入商用的全流程,确保系统稳定运行。

zero1的博客 896

Linux select函数——学习笔记

Linuxselect函数 select.c #include <stdio.h> #include <sys/time.h> #include <sys/types.h> #include <unistd.h> /* 功能:多路复用 int select(int nfds, fd_set *readfds, fd_set *writefd...

Love丶伊卡洛斯 588

Pico-实时预览工具PreviewTool

Unity XR SDK与Preview Tool下载链接:SDK - Pico Developer Platform1、下载Preview Tool后,将PreviewTool的APK先安装在VR头显里2、在PC端打开Preview Tool.exe文件Window -> Package Manager -> Add package from disk,选择下载的pico sdk中的package.json(如下图),Open导入。Edit -> Project Settings,设置设备和安卓版本,如下

晴天下的大头娃娃 4252

手把手教你用Ollama & AnythingLLM搭建AI知识库,无需编程,跟着做就行!

本地运行大模型耗资源,需要选择较小的模型作为基础模型。在终端中运行时可能会出现 CUDA 错误,表示显存不足,导致提供的端口失效。中文支持不够完善。\3. 文中提到的技术软件工具有:Ollama、Chatbox、Open WebUI、向量数据库、嵌入模型、本地模型 Gemma、AnythingLLM。

2401_86435672的博客 1万+

Linux编程之select

select系统调用的的用途是:在一段指定的时间内,监听用户感兴趣的文件描述符上可读、可写和异常等事件 为什么会出现select模型 先看一下下面的这句代码: int iResult = recv(s, buffer,1024); 这是用来接收数据的,在默认的阻塞模式下的套接字里,recv会阻塞在那里,直到套接字连接上有数据可读,把数据读到buffer里后recv函数才会返回,不然就会一直阻塞在那里。在单线程的程序里出现这种情况会导致主线程(单线程程序里只有一个默认的主线程)被阻塞,这样整个程

Answer的博客 1632

VxWorks系列 快速导航

Vxworks系列快速阅览导航

Mr.Sugarcane 1309

深入理解select函数

select作为最早的 I/O 多路复用机制,设计简洁但存在诸多限制。理解它的实现原理(遍历+回调)有助于深入理解后续的poll和epoll的优化思路。在现代高并发场景中应优先考虑epoll,但select的简单性使其在低并发和嵌入式场景仍有价值。

qq_32768419的博客 192

杰理SDK入门教程(一):SDK的四种编译方式的使用

杰理SDK提供了四种主要编译方式:1) JL Studio官方IDE,适合初学者;2) VS Code轻量级编辑器,需在SDK根目录打开;3) 命令行/脚本编译,灵活支持自动化;4) Code::Blocks开源IDE。每种方式都有详细操作指南,开发者可根据需求选择,初学者推荐从JL Studio开始熟悉编译流程。环境配置注意事项和编译成功标识均有明确说明,确保开发效率。

qq_42014563的博客 1149

《Python入门到精通》函数详解

函数就是一段「封装」起来的「代码」,目的是提高代码的「模块性」和「复用性」。 2、函数的参数 2.1、变量的就近原则 2.2、传递参数 2.3、形参和实参 2.4、位置参数 2.5、缺省参数 2.6、可变类型和不可变类型 2.7、关键字参数 3、匿名函数 4、函数的返回值

wangyuxiang946的博客 1万+

Poll/Select机制在驱动中的实现

本文探讨了Linux驱动中poll/select机制的实现要点。通过一个传感器驱动调试案例,分析了用户空间与内核的交互流程,详细讲解了驱动侧需要实现的三个关键动作:定义等待队列、编写poll函数和在适当时机唤醒队列。文章提供了完整的代码示例,并总结了常见陷阱(如忘记调用poll_wait、唤醒时序错误等)和调试技巧。作者结合多年经验建议,驱动开发需考虑系统整体性能,正确处理边界条件,使用原子操作避免竞态。poll/select作为连接硬件和应用的关键桥梁,其稳定实现需要关注细节设计。

m0_73356859的博客 553

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

18.【网络】多路转接select系统调用详解

摘要:select系统调用是经典的I/O多路复用实现,允许单进程监视多个文件描述符的可读、可写和异常状态变化。其核心机制是通过位图fd_set结构来管理待监视的fd集合,当有fd状态变化或超时触发时解除阻塞。调用时需设置最大fd值+1(nfds)和超时参数,返回后内核会重写fd_set仅保留就绪fd。使用时需注意每次调用前重新初始化fd_set,避免脏数据问题。select适用于socket编程,可高效检测连接、数据传输等网络事件的就绪状态。

恢弘志士之气,不宜妄自菲薄 905

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

别再乱用sleep了!Linux C/C++高精度延时函数实战避坑指南(附代码)

本文深入探讨Linux C/C++开发中高精度延时函数的正确使用方法,对比分析sleep、usleep、nanosleep等函数的性能陷阱与适用场景,提供实战避坑指南和优化代码示例,帮助开发者实现精准定时与高效性能。

weixin_30633405的博客 419

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

2024/03/19(网络编程·5)

【代码】2024/03/19(网络编程·day5)

qq_55245263的博客 666

Linux下select使用陷阱

一见 1万+

Windows,Linux的select函数功能差异

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33910460的博客 243

Linux 网络编程 - Select 多路复用

Select 是单进程处理多连接的基础方案,核心是通过 fd_set 监听多个文件描述符的状态变化;适用场景:小并发(<1000)、高实时(微秒级超时),替代多线程 / 多进程节省内存;核心痛点:1024 fd 限制、轮询效率低,大并发场景需升级为 epoll;关键操作:每次循环重新拷贝 fd 集合、及时移除无效 fd、合理设置监听范围。

weixin_74435488的博客 598

【深度解析】select模型中的FD_SET:从宏定义到实战陷阱

本文深入解析select模型中的FD_SET宏及其相关操作,从位图原理到网络编程实战陷阱。详细介绍了fd_set数据结构、FD_SET宏家族的使用方法,以及select模型的工作机制与常见问题,帮助开发者避免高并发场景下的性能瓶颈和调试难题。

weixin_34326429的博客 420

linux select 错误码,linux下面select返回115错误

或者你会发现,你在编写程序时,不注意,或者一个很不起眼的写法,可它会给你带来很无奈的错误,让你很久才会发现,原来这个问题是这么回事。1、常见的写法问题这个问题看似不怎么,根据原理select会重置参数,所以fd这个参数在调用完select之后会被更改,所以下次执行select必须重新设置fd,就是说要将 FD_ZERO(&fd); FD_SET( skt, &fd);放在do,wh...

weixin_39911998的博客 1598
上一篇: linux(Ubuntu)安装(更新)cmake
下一篇: ubuntu apt-get update 出错
力宁
博客等级 码龄12年 13粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值