I/O复用-Select函数

I/O多路复用(select,poll)函数及示例程序 I/O多路复用 在网络编程中,不得不提的一个概念就是I/O多路复用机制,采用I/O多路复用机制,使得内核一旦发现进程指定的一个或多个I/O条件就绪,就通知进程进行处理,能够同时处理多个描述符。 目前Linux上的I/O多路复用机制主要有三种select,poll,epoll,因为select与poll比较相似,因此这篇文章先讲select和poll函数。 接下来分别从函数、结构、注意点分别进行说明... 阅读详情

I/O复用的意义

为了构建并发服务器,一般需要为每个客户端连接都创建一个进程进行通信,不过创建和维护进程的开销是巨大的,需要大量的运算和内存空间,每个进程都有独立的内存空间,所以相互交换数据也要求采用相对复杂的方法,比如管道等。

这时I/O复用就能有效的改善这种情况,他可以使一个进程同时为多个客户端提供服务,当然这里所说的同时并不是真正意义上的同时发生。

 

Select实现复用服务器端

实现原理

select函数可以将多个文件描述符集中在一起统一监视。根据函数返回的值找出发生事件的描述符。

函数详解

select函数使用方法与一般函数区别较大,定义如下:

int select(int maxfd, fd_set *readset, fd_set *writeset, fd_set *exceptset,

const struct timeval *timeout);

/* 成功时返回大于0的值,为几代表有几个套接字状态发生了变化,失败返回 -1 */

 

参数中有3个fd_set数组,这个数组是存有0和1的位数组,readset、writeset、exceptset这三个分别代表对套接字数组监视的事件,如readset数组中值如下:

readset

| 0 | 1 | 0 | 0 | 1 |

 

表明select函数监听了套接字1和4的读事件,也就是说如果套接字1和4变得可读,那么select就会成功返回。另外两个数组道理也是一样。

处理fd_set位数组,c已经提供了基础的函数:

位操作函数

FD_ZERO (fd_set *fdset); /* 将数组位全部置为0 */

FD_SET (int fd ,fd_set *fdset); /* 往数组中注册套接字fd,即将该位置为1 */

FD_CLR (int fd ,fd_set *fdset); /* 从数组中清除套接字fd,即将该位置为0 */

FD_ISSET (int fd ,fd_set *fdset); /* 查询数组中是否已经注册了套接字fd,是返回true */

文件描述中的监视范围与select的第一个函数有关,因此需要得到fd_set数组的注册元素大小,然后作为maxfd值传入函数。

另外一个重要的参数就是timeout,select默认在发生监视的事件时才返回,不然会一直阻塞,为了防止阻塞时间过长,就可以通过传递timeout设置超时时间,超过timeout后函数会返回0;

struct timeval

{

long tv_sec; /* seconds */

long tv_usec; /* microseconds */

}

 

查看结果

select返回后如何判断哪些描述符发生了变化呢?还是通过fd_set数组,函数完成后,fd_set除了发生事件的描述符,其他的都会被置为0,因此返回后位数组中还是为1的描述符就是发生事件的描述符,查找的方式就是循环fd_set数组,使用FD_ISSET函数判断是否该位为1,然后根据3个数组分别进行相应的读写操作即可。

需要注意的是,当需要select循环监听时,select每次成功返回后,都需要重新设置监听位,因此上一次返回后将位数组都打乱了。

 

附

Apache默认使用的就是select机制,对应的Nginx使用的是Epoll,这个后面会再做分析。

以上就是select函数的使用和原理,可以称为I/O复用的核心。

【unix网络编程第三版】阅读笔记(五):I/O复用:select和poll函数 本博文主要针对UNP一书中的第六章内容来聊聊I/O复用技术以及其在网络编程中的实现 1. I/O复用技术I/O多路复用是指内核一旦发现进程指定的一个或者多个I/O条件准备就绪,它就通知该进程。I/O复用适用于以下场合:(1) 当客户处理多个描述符(一般是交互式输入或网络套接字),必须适用I/O复用(2) 当一个客户处理多个套接字时,这种情况很少见,但也可能出现(3) 当一个TCP服务器既要处理监听套 阅读详情

相关推荐

两层板如何做阻抗控制呢

两层板如何做阻抗控制呢? 这个问题可能很多人都会碰到,有的人在此等需要做阻抗控制的情况都选择做多层板。诚然,多层板在阻抗控制,EMC等等方面都有着天然的优势。然而,在价格上和周期上,两层板就有着绝对优势了。 对于成本非常敏感而又不是太复杂的产品,尽管对于我们硬件工程师而言,有一堆的理由要求使用多层板。然而在面对毛都不懂的老板“别人能做,你为什么不能做?”这个问题时只得低下我们高傲的头颅。 好...

weixin_42005993的博客 2万+

I/O复用函数的使用——select

之前为了让服务器能够服务多个客户端,我们使用多线程或多进程进行服务器的并发,意味着有多少个客户端就要产生很多进程。会浪费,开销很大。所以我们引入i/o复用i/o复用方法select,poll,epoll可以帮助应用程序找到就绪描述符eg:老师检查作业,谁写完了谁举手,老师过去检查,不用一个一个等待去检查

weixin_75197906的博客 887

TexGen模型导出到ABAQUS的inp文件:如何快速修改纱线材料属性(避坑指南)

本文针对TexGen模型导出到ABAQUS的inp文件后纱线材料属性缺失或错误的问题,提供了高效的解决方案。文章详细解析了inp文件结构,指导用户如何手动定位并修改纱线材料属性,并提供了可批量处理的Python脚本,帮助用户快速、精准地完成材料参数赋值,有效提升复合材料仿真工作效率。

ice55的博客 603

Linux I/O复用之select函数详解

select函数的功能和调用顺序使用select函数时统一监视多个文件描述符的: 1、 是否存在套接字接收数据? 2、 无需阻塞传输数据的套接字有哪些? 3、 哪些套接字发生了异常?select函数调用过程: 由上图知,调用select函数需要一些准备工作,调用后还需要查看结果。设置文件描述符select可以同时监视多个文件描述符(套接字)。 此时需要先将文件描述符集中到一起。集

未来之歌 1万+

Android 开发实战:从零到一集成 espeak-ng 实现中文离线 TTS(无需账号开箱即用)

本文详细介绍了如何在 Android 项目中集成 espeak-ng,实现中文离线语音播报。通过下载 so 库、编写 Java 接口、封装管理类,开发者可快速构建无需账号的 TTS 功能。文章覆盖从零到一的开发步骤、调试技巧及性能优化,适合中高级 Android 开发者参考。

全栈 3320

基于Android平台下的健康管理APP/基于android的健康管理系统

随着网络科技的发展,移动智能终端逐渐走进人们的视线,相关应用越来越广泛,并在人们的日常生活中扮演着越来越重要的角色。因此,关键应用程序的开发成为影响移动智能终端普及的重要因素,设计并开发实用、方便的应用程序具有重要的意义和良好的市场前景。Android技术作为当前最流行的操作平台,自然也存在着大量的应用服务需求。 本课题研究的是基于Android技术平台的健康管理APP,开发这款健康管理APP主要是为了帮助用户可以不用约束时间与地点进行所需信息。本文详细讲述了健康管理APP的界面设计及使用,主要包括界面的

m0_73706453的博客 1439

IO复用:select函数

IO模型: (1)阻塞式IO模型:          最流行的I/O模型是阻塞式I/O模型,默认情况下,所有的套接字都是阻塞的。 如上图所示,进程调用recvfrom,其系统调用直到数据报到达且被复制到应用进程的缓冲区中或发生错误才返回。最常见的错误是系统调用被信号中断,我们说进程在从调用recvfrom开始到它返回的整段时间内是被阻塞的。recvfrom成功返回后,应用进程开始处理

ooooo12345re的博客 1704

【花雕学编程】Arduino动手做(249)---ESP32+GC9A01之播放GIF的空战锁定动画

摘要: 本实验基于ESP32开发板,驱动1.28寸圆形IPS彩色TFT显示屏(GC9A01驱动,240×240分辨率),通过SPI接口实现GIF动画播放。利用TFT_eSPI和AnimatedGIF库,成功加载并循环播放预置的科幻风格GIF动画(如HUD界面、X翼战机等)。代码实现了GIF解码、逐帧渲染及动态显示功能,通过串口调试监控运行状态。实验验证了该显示屏在动态图像显示中的流畅性,为嵌入式图形应用提供了实用方案,适用于智能穿戴、交互设备等场景。 关键词: ESP32、GC9A01、圆形TFT、GIF播

雕爷学编程 492

【网络编程】IO多路复用:select函数

nfds监听的所有文件描述符中,最大文件描述符+1,表待监听文件符的数量,文件描述符下标从0开始。*readset读文件描述符监听集合,传入、传出参数writeset写文件描述符监听集合,传入、传出参数exceptset异常文件描述符监听集合,传入、传出参数timeout定时器大于0设置监听超时时长NULL阻塞监听0非阻塞监听,轮询那么如何设置这些描述符集合呢?以下的宏可以帮助到我们。//清空一个文件描述符集合//将待监听的文件描述符,添加进监听集合中。......

qq_41950508的博客 1523

【DRAM存储器六十四】DDR5介绍--preamble、postamble、interamble、刷新、power down、MPSM

简述DDR5 reamble、postamble、interamble、刷新、power down、MPSM的功能定义

highman110的博客 339

基于投影法实现扫描文件的光学字符分割——Matlab实现

投影法是指将原图像沿着某个特定的方向进行投影,得到投影线上的像素点的个数或像素值总和,从而可以得到该方向上物体的轮廓信息。对于字符分割,我们可以将图像进行水平和垂直两个方向的投影,从而得到字符之间的分割线。在OCR技术中,字符分割是非常重要的一步骤,因为字符之间的分割对字符识别的准确性有很大的影响。通过对投影值的判断,可以求出字符之间的分割线,这里我们根据垂直方向上的投影值进行判断,选取一个阈值进行筛选即可。使用sum()函数分别计算出水平和垂直方向上的投影值,得到每一行和每一列的投影值。

TechGlide的博客 582

select函数--IO多路复用详解

本章基于网络编程,需要学习网络编程的可以看我这篇博客: socket编程(超简单、详细、可运行)–实现一个简单的聊天程序 什么是多路复用IO呢? 多路io:允许同时对多个I/O进行控制 可能这样说还是有点抽象,stm32下面有GPIO口,如果我需要一个LED屏幕连接在32开发板上面,是不是又很多的接线,每个接线接着板子上面的对应引脚上面,既然我们接线这个引脚了,是不是首先需要让这个引脚处于使能状态,这就是开时钟,多个引脚我们是不是要开多个引脚的时钟。配置好后我们的开发板的处理器是不是会按照需要去对这些IO口

玫瑰花店的博客 1760

《C++等级认证CCF-GESP真题解析》专栏总目录

❤️ 专栏名称:《C++等级认证CCF-GESP真题解析》🌸 专栏介绍:中国计算机学会GESP《CCF编程能力等级认证》C++编程(1~8级)历届真题解析。🚀 订阅专栏:订阅后可阅读专栏内所有真题解析,真题持续更新中,欢迎订阅!

人生就是一个不断学习的过程 6294

I/O复用select函数

《UNIX网络编程第六章笔记》 1、liunx下可用的5种I/O模型:阻塞式I/O、非阻塞式I/O、I/O复用、信号驱动I/O、异步I/O 1.1、阻塞式I/O 默认情形下,所有套接字都是阻塞的,以数据报套接字为例,如图所示: 1.2、非阻塞式I/O 当一个应用进程像这样对一个非阻塞描述符循环调用recvfrom时,称之为轮询。应用进程持续轮询内核,以查看某个操作是否就绪。这么做

2115

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

tcp,select函数支持I/O复用

Unix函数select和poll, 用来支持Unix中I/O复用的功能,在Unix中I/O模型可以分为以下几种: (1)阻塞I/O (2)非阻塞I/O (3)I/O复用(select和poll) (4)信号驱动I/O(SIGIO) (5)异步I/O 阻塞I/O是当应用程序和内核交换数据时,由于内核还没有准备好数据,那么应用程序必须进行阻塞,不能继续执行,直到内核的数据准备好!应用程序

just do it 965

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

I/O复用函数的使用(select)

select 系统调用的用途是:在一段指定时间内,监听用户感兴趣的文件描述符的可读、可写和异常等事件。select 系统调用的原型如下:

ljy的博客 967

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

I/O复用-select函数

之前我们使用了几种服务器模型,一个是单进程的, 同一时候只能给一个客户端提供服务, 后来我们使用了多进程, 每个客户端fork新进程进行业务处理 IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取,它就通知该进程,可以使用一个进程服务多个客户端. 多进程服务模型: I/O 复用进程模型: select 实现I/O 复用 select函数原型: #include <sys/...

weixin_34194702的博客 122

218-I/O复用函数的使用(select)

I/O 复用使得程序能同时监听多个文件描述符,这对于提高程序的性能至关重要。通常,网络程序在下列情况下需要使用 I/O 复用技术: ◼ TCP 服务器同时要处理监听套接字和连接套接字。 ◼ 服务器要同时处理 TCP 请求和 UDP 请求。 ◼ 程序要同时处理多个套接字。 ◼ 客户端程序要同时处理用户输入和网络连接。 ◼ 服务器要同时监听多个端口。 (同时处理多个描述符) 需要指出的是,I/O 复用虽然能同时监听多个文件描述符,但它本身是阻塞的。并且当多个文件描述符同时就绪时,如果不采取额外的措施,程序就只能

LINZEYU666的博客 347

I/O复用:select和poll函数

I/O复用:select和poll函数 进程预先告知内核,使得内核一旦发现进程指定的一个或多个I/O条件就绪就通知进程的能力是I/O复用。 使用场景: 客户处理多个描述符时,必须使用I/O复用 一个客户同时处理多个套接字 一个TCP服务器既要处理监听套接字,又要处理已连接套接字 一个服务器既要处理TCP,又要处理UDP 一个服务器要处理多个服务或者多个协议 I/O模型 阻塞式I/O 非阻塞式I/O I/O复用 信号驱动式I/O 异步I/O 阻塞式I/O [外链图片转存失败,源站可能有防盗链机制,建议

一只菜鸟的练级路 241

UNIX网络编程笔记:I/O复用:select和poll函数

这是最基础的I/O模型,所有操作默认按顺序执行。。这种同步等待特性是其最显著特征。

梅见十柒的博客 1805

多路I/O复用之select函数

关于select函数的各个参数以及多路I/O复用,上面的这篇博客介绍的很清楚了.走一遍实现代码 这个代码主要是实现udp同时能够进行收发 #include <string.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/select.h&gt...

Zyong139064359的博客 186

I/O多路复用及select函数解析及实例

概述 在进行解释之前,首先要说明几个概念: - 用户空间和内核空间 - 进程切换 - 进程的阻塞 - 文件描述符 - 缓存 I/O 用户空间与内核空间 现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方)。操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。为了保证用户进程不能

Megustas_JJC的博客 912

day2 I/O多路复用select函数

是三个集合中编号最高的文件描述符,加上1;

m0_58066972的博客 552

Linux中I/O复用——select函数详解及代码实现

Linux中I/O复用——select函数详解及代码实现 一、I/O复用 1、I/O复用概念:  解决进程或线程阻塞到某个 I/O 系统调用而出现的技术,使进程不阻塞于某个特定的 I/O 系统调用。 2、I/O复用使用的场合: (1)当客户处理多个描述符(通常是交互式输入、网络套接字)时,必须使用I/O复用。 (2)tcp服务器既要处理监听套接字,又要处理已连接套接

MOON5555的博客 543

I/O多路复用及select函数

、

qq_43341187的博客 152

I/O复用---select函数实现并发服务器

基于I/O复用的服务器端 复用技术在服务器端的应用 多进程服务器端模型:(一个进程对应一个客户端)                                                                             在模型中引入复用技术,减少进程数。无论连接多少客户端,提供服务的进程只有1个。                                   ...

amoscykl的博客 2533
上一篇: 进程间通信(IPC)
下一篇: 大型网站架构模式
jj_jameholl
博客等级 码龄10年 5粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值