浅谈IO多路转接之select-----基础网络

matlab 显示曲面网格【2025最新版】 matlab点云工具箱对点云三维重建结果显示的函数。博客长期更新,本文最近更新时间为:2025年9月14日。 阅读详情

一、select原型

#include<sys/select.h>
int select(int nfds,fd_set *readfds,fd_set *writefds,fd_set *exceptfds,struct timeval *timeout);

二、参数解释:

        1.参数nfds是需要监视的最大文件描述值+1;

        2.rdset,wrset,exset分别对应于需要检测的可读文件描述符的集合,可写文件描述符的集合及异常文件描述符的集合;

        3.参数timeout为结构timeval,用来设置select()的等待时间。

三、参数timeout取值

        1.NULL:表示select()没有timeout,select将一直被阻塞,直到某个文件描述符发生了事件;

        2.0:仅检测描述符的状态,然后立即返回,并不等待外部事件的发生;

        3.特定的实际值:如果在指定的时间段里没有事件发生,select将超时返回。

四、fd_set结构

        其实这个结构就是一个整型数组,更严格的说,是一个“位图”,使用位图中对应的位表示要监视的文件描述符。

select中fd_set结构不能使用与、或、非操作,只能使用相对应的操作:

1.用来消除描述词组 set中相关fd的位;

void FD_CLR(int fd,fd_set *set);

2.用来测试描述词组set中的相关fd的位是否为真;

void FD_ISSET(int fd,fd_set *set);

3.用来设置描述词组set中相关的位;

void FD_SET(int fd,fd_set *set);

4.用来消除描述词组set的全部位;

void FD_ZERO(int fd,fd_set *set);

五、函数返回值

        1.执行成功则返回文件描述符状态已经改变的个数;

        2.如果返回0代表在描述词状态改变之前已经超过 timeout时间,没有返回;

        3.当有错误发生时则返回-1,错误原因存于error,此时参数readfd、writefd、exceptfd和timeout的值变成不可预测。

六、socket就绪条件

读就绪:

        1.socket内核中,接收缓冲区中的字节数,大于等于低水位标记SO_RCVLOWAT。此时就可以无阻塞的读该文件描述符,并且返回值大于0;

        2.socket TCP通信中,对端关闭连接,此时对该socket读,则返回0(四次挥手);

        3.监听的socket上有新的连接请求;

        4.socket上有未处理的错误。

写就绪:

        1.socket内核中,发送缓冲区中的可用字节数(发送缓冲区的空闲位置大小),大于等于低水位标记SO_RCVLOWAT。此时可以无阻塞的写,并且返回值大于0;

        2.socket的写操作被关闭。对一个写操作被关闭的socket进行写操作,会触发SIGPIPE信号;

        3.socket使用非阻塞connect连接成功或失败之后;

        4.socket上有未读取的错误;

异常就绪:

        socket上带外数据。关于带外数据,和TCP紧急模式相关(TCP协议头中的紧急指针字段)。

七、select的特点

        1.可监控的文件描述符个数取决于sizeof(fdset)的值;

        2.将fd假如select监控集的同时,还要使用一个数据结构array保存放到 select监控集中的fd。

八、select缺点

        1.每次调用select,都需要手动设置fd集合,从接口使用角度来说非常不便;

        2.每次调用select,都需要把fd集合从用户态拷贝到内核态,这个开销在fd时会很大;

        3.同时每次调用select都需要在内核遍历传递进来的所有fd,这个开销在fd很多时也很大;

        4.select支持的文件描述符数量有限。


【图论】系列(七)图论的中心性度量方法及重要性评价指标 图论中的中心性度量方法是用来衡量图中各个节点(或顶点)相对重要性的指标。 阅读详情

相关推荐

【Zephyr 系列 29】低功耗调试指南:电流测量、系统睡眠与功耗分析

Zephyr低功耗调试指南(150字摘要) 针对物联网设备续航需求,本文解析Zephyr低功耗调试方法:1️⃣ 机制:启用PM子系统和tickless idle,配置睡眠策略;2️⃣ 测量:推荐功耗分析仪捕捉μA级电流波动;3️⃣ 优化:管理唤醒源(如GPIO/RTC)、调整BLE广播/连接参数,挂起闲置外设;4️⃣ 分析:建立功耗文档,对比不同模式电流(如待机0.6mA vs广播3.2mA)。强调低功耗需系统性设计,初期即需纳入测试流程。下期将探讨Zephyr OTA升级实现。

hemoparrot的专栏 1180

socket select()用法

一、winsock中#include 原型int select(int nfds,fd_set* readfds,fd_set* writefds,fd_set* exceptfds,const struct timeval* timeout);nfds:本参数忽略,仅起到兼容作用。   readfds:(可选)指针,指向一组等待可读性检查的套接口。   writefds:(可选)

winson的专栏 2742

金融领域强化学习在多资产类别动态交易执行中的应用

在金融市场中,多资产类别的交易执行面临着诸多挑战,如市场的不确定性、资产间的复杂相关性等。传统的交易策略往往难以适应动态变化的市场环境。本研究的目的在于探索如何运用强化学习技术,实现多资产类别在动态市场环境下的高效交易执行。具体范围涵盖了从强化学习的基本原理到在多资产交易场景中的实际应用,包括核心算法的实现、数学模型的构建以及项目实战等方面。本文首先介绍研究背景,包括目的、预期读者和文档结构。接着阐述核心概念,包括强化学习和多资产类别动态交易执行的原理及其联系。

AI 领航者的博客 630

Linux socket编程(二)之select()

Linux socket编程(二)之select()      seclet()监听指定文件描述符集中的成员是否发生读写或者异常的变化。函数原型如下:        int select(int maxfd,fd_set *readfds,fd_set *writefds,fd_set *errorfds,struct timeval *timeout); /*maxfd:集合中最大的文件描述

木有 1098

Zynq7020实战:ARM Cortex-A9降频避坑指南(附温度对比测试)

本文详细介绍了如何在Zynq7020平台上对ARM Cortex-A9处理器进行降频优化,以降低功耗并提升系统稳定性。通过分析时钟架构、提供实战操作步骤和温度对比测试数据,帮助开发者有效避免降频过程中的常见问题,实现嵌入式系统的高效能耗管理。

root9的博客 206

《UE4游戏开发》之 《查cook资源失败,问题记录》

当项目打包时,cook出错,但是从原始引擎提供的信息中,没有提示具体的那个资源出错,要查到出错资源,还是非常麻烦。 下面就材质cook出错,增加一些日志,方便查找问题做简单记录 材质cook的一个阶段,是收集MaterialShaderMap,如果在这个阶段收集的信息出错,将会在FShaderMapContent::GetOutdatedTypes函数中,因为Shaders指针指向的内存有问题而出错,通过断点发现,FShaderMapContent这个类对象指针为null,而这个类对象的来源于AllMat.

qq_21919621的博客 2580

SELECT 入门详解

在winsock的编程中,winsock有许多阻塞函数。比如:accept,recv等。线程执行到这个函数时就会挂起,等条件满足时再继续执行。比如,服务器端accept,只有当客户端执行connect时,才会接着往下执行。而使用select模型,进行通信,可以避免线程挂起,减少资源消耗。select模型,使用范围很广,通常用作网络通讯的客户端,或者连接数较小的服务端,如局域网游戏。

缥缈的云 专栏 1272

微腔光频梳仿真入门:MATLAB求解LLE方程全流程解析

光学频率梳在精密测量、光通信和微波光子学中有着广阔应用,而微环谐振腔中的Kerr非线性与四波混频效应能够紧凑地产生宽带梳齿。仿真这类系统的核心是求解Lugiato-Lefever方程(LLE),但直接从物理参数到数值代码往往让初学者无从下手。本文从微腔光频梳的物理图像出发,介绍LLE方程的推导与归一化方法,并重点讲解MATLAB数值实现的两种思路:基于ode45的频域耦合方程组求解与分裂步长RK4IP方法。同时讨论失谐扫描、孤子态识别、参数稳定性边界,以及如何将真实器件参数换算为无量纲仿真参数。无论你是刚接

weixin_32325225的博客 292

select模型 writefds 测试

这里测试连接成功后的套接字,select时,套接字始终是可以状态,即可以发送数据 服务端: #include #include #pragma comment(lib,"WS2_32") #define PORT 1234 int main() { //初始化ws2_32.dll WSADATA wsaData; WORD sockVersion = MAKEWORD(2,2)

ShadowAssassin的专栏 3948

Aruba CX交换机 初始化配置

Aruba CX 交换机 6000系列 8000系列交换机配置

Harry_Guo 1834

物联网设备数据是如何流转的:基于EMQX与TDengine的前后端分离项目实践

背景 在我写了TDengine极简实战:从采集到入库,从前端到后端,体验物联网设备数据流转这篇文章后,不少读者朋友评论、私信说可不可以提供代码参考学习下,那必须是可以的。那篇文章主要介绍了数据采集、数据传输、数据转发、数据解析、数据存储、数据查询、数据呈现、数据导出、消息推送的物联网设备数据流程过程,作为体验 TDengine 的极简实战项目,没引入过多的业务设计(复杂功能)以及异步解耦设计(消息中间件)。 在整理代码的过程中,我发现虽然整个项目并不复杂,但是涉及到的技术点较多,有必要对关键的组件进行说明

Heartsuit的博客 9411

对select()参数fdset的完整理解

虽然写了很多代码,但select我就从没有完整理解过,要用时不过copy paste而已。惭愧! 今天决定要对select()参数fdset有一个完整理解。Go! 先上一段代码(代码1-1),这段代码做的事情是 1. 创建一个socket来listen请求 2. 调用select等待新请求、等待已有请求的数据收发状态READY 3. 当有新连接请求来的时候就调用accpe

余璜的技术博客 8372

MSP430FR6043超声波传感器设计记录

1.前言 最近项目设计了一个超声波传感器 参考TI官方的板子EVM430-FR6043搭建的电路 EVM430-FR6043评估模块是一个用于评估MSP430FR6043 MCU性能的开发平台。 MSP430FR6043 MCU是一款超低功耗器件, 集成了超声波感测模拟前端 用于精确地进行超声波测量。 专为超声波水表、热量计和燃气表而设计, MSP430FR6043 器件采用低功耗加速器 (LEA), 可实现基于高速 ADC 的信号采集以及后续优化数字信号处理, 为电池供电型计量提供了一款超低功耗、高

bingdund的博客 2865

【Linux】网络高级IO

【Linux】网络高级IO

cefler的博客 2386

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

【Linux网络编程】select函数详解

作用: select函数是用来监视一个或多个文件句柄的状态变化的,可阻塞也可不阻塞。 函数原型: int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); 函数参数意义: fd_max:传入的监视文件描述符集合中最大的文件描述符数值 + 1,因为select是从0开始一直遍历到数值最大的标识符。 readfds:文件

qq_33197518的博客 837

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Select模型解析-什么时候可写

// 文章出处 精通Windows Sockets网络开发:基于Visual C++实现.pdf // 服务器一般实现过程 nErrCode = WSAStartup(wVersion, &wsaData);// 初始化socket库 m_sServer = socket(AF_INET,SOCK_STREAM, IPPROTO_TCP);// 创建socket ioctlsocket(

bjl0523的专栏 1383

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

MySQL - SQL窗口函数

1.应用场景 窗口函数解决的问题包括:1)排名问题2)top N问题 应用工作中, 面试中. 2.学习/操作 //注意,mysql版本8已至此窗口函数这个功能, 如果低于该版本, 会出现SQL报错! 一.窗口函数有什么用? 在日常工作中,经常会遇到需要在每组内排名,比如下面的业务需求: 排名问题:每个部门按业绩来排...

"代码"的日常搬运 1万+

sharemouse切窗口就锁定了什么原因_巩固SQL - 窗口函数&变量&数据透视图

入数据行业近3年了,这3年的工作时间我绝大多数时间都在写python做分析。但作为合格的一个数据分析师,sql的精通肯定是必不可少的,所以最近疯狂刷sql题,同时也来总结下我以前比较少用的语法。(工作写的是hive,为方便演示,本文章均使用Mysql8.0.16版本)一、窗口函数1、什么是窗口函数窗口函数,也叫OLAP函数(Online Anallytical Processing,联机分析处理)...

weixin_39603622的博客 265

select、poll、epoll

文章目录select、poll、epoll多路复用:selectselect存在三个问题:pollepoll三者之间的区别BIO、NIO、reactor模型 select、poll、epoll 多路复用: 多路指的是多个socket网络连接、复用指的是复用一个线程、多路复用主要有三种技术:select、poll、epoll,epoll io多路复用是通过一种机制,一个进程可以监视多个描述符,一旦某个描述符就绪,能够通知程序相应的读写操作,但是select、poll、epoll本质上都是同步IO,因为他们都需

clsld的博客 2101

嵌入式 Linux网络编程(四)——Select机制

嵌入式 Linux网络编程(四)——Select机制一、select工作机制poll和select,都是基于内核函数sys_poll实现的,不同在于在linux中select是从BSD Unix系统继承而来,poll则是从SYSTEM V Unix系统继承而来,因此两种方式相差不大。poll函数没有最大文件描述符数量的限制。poll和 select与一样,大量文件描述...

weixin_34362790的博客 2823

Linux网络编程(select复用详解)

IO多路复用技术使得程序运行时可同时监听多个文件描述符,对于现实中出现的实际情况有重要意义。多路复用通过三中不同的系统调用——select、poll、epoll来实现,通常来说以下情况需要使用多路复用: 1、客户端同时处理多个客户端请求; 2、客户端程序需要同时处理用户操作和网络连接; 3、TCP服务器同时处理监听socket和连接socket; 4、服务器同时处理UDP和TCP请求; 5、服务器同时监听多个端口或处理多种服务(xinetd服务器)。 一、select API  select系统调用的..

$好记性还是要多记录$ 926

select详解

#inlcude > int select(int nfds, fd_set *restrict readfds, fd_set *restrict writefds,                              fd_set *restrict errorfds, struct timeval *restrict timeout); 参数:nfds给出了要监

djinglan的专栏 1483

【Linux编程】IO复用之select详解

IO复用技术使得程序能够同时监听多个文件描述符,这对提高程序的性能至关重要。 Linux下实现IO复用的系统调用主要有select,poll和epoll,本文主要介绍select,后两个将在后续文章中介绍。 本文介绍通俗易懂,以便于自己日后复习和广大新手们不会感到太困惑。 select系统调用 select系统调用的主要用途是:在指定的一段时间内,轮询监听用户感兴趣的文件描述符,即用户添加

lk_wkqd的博客 1478

Select()系统调用及文件描述符集fd_set的应用

【 原文由 张 卿 所发表 】  在网络程序中,一个进程同时处理多个文件描述符是很常见的情况。select()系统调用可以使进程检测同时等待的多个I/O设备,当没有设备准备好时,select()阻塞,其中任一设备准备好时,select()就返回。 select()的调用形式为: #include #include int select(int maxfd, fd_set *readfds, f

重剑无锋 2126

Linux: fd_set用法

Linux: fd_set用法 2010-04-13 23:58 select()机制中提供一fd_set的数据结构,实际上是一long类型的数组,每一个数组元素都能与一打开的文件句柄(不管是socket句柄,还是其他文件或命名管道或设备句柄)建立联系,建立联系的工作由程序员完成,当调用select()时,由内核根据IO状态修改fe_set的内容,由此来通知

海纳百川 2万+

select函数中参数nfds的理解

函数原型   #include        #include        #include        int select(int nfds, fd_set *readfds, fd_set *writefds,                   fd_set *exceptfds, struct timeval *timeout);        vo

qimi123456的专栏 4153
上一篇: 高级IO知识点图解-----网络基础
下一篇: 闭散列解决哈希冲突-----数据结构
CYD、孤狼
博客等级 码龄9年 24粉丝 129原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值