IO多路转接之select

IO多路转接之select

1. 初识select

系统提供select函数来实现多路复用输入/输出模型。

  • select系统调用是用来让我们的程序监视多个文件描述符的状态变化的;
  • 程序会停在select这里等待,直到被监视的文件描述符有一个或多个发生了状态改变;

2. select函数原型

image-20230805085355114

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

2.1 参数解释

  1. nfds:输入型参数,是需要监视的最大的文件描述符值 + 1;

  2. rdset,wrset,exset,timeout:输入输出型参数

    rdset:需要检测的可读文件描述符的集合,wrset:可写文件描述符的集合,exset:异常文件描述符的集合;

    timeout:timeval结构体,用来设置select()的等待时间,共有三个可以被设置的选项:

    • NULL:阻塞等待,直到某个文件描述符上发生了事件;

    • 0:非阻塞等待,然后立即返回。

    • 具体的时间:指定的时间段里阻塞等待,如果等待成功返回剩余时间,否则将超时返回。

  3. 函数返回值:

    n > 0 :n个文件描述符就绪;

    n == 0:超时返回

    n < 0 :等待失败

2.2 fd_set结构

image-20230805092931574

其实这个结构就是一个“位图”。使用位图中对应的位来表示要监视的文件描述符。完成用户和内核之间的信息的互相传递。

这里提供了一组操作fd_set的接口,来比较方便的操作位图。

void FD_CLR(int fd, fd_set *set); 	// 用来清除描述词组set中相关fd 的位
int FD_ISSET(int fd, fd_set *set); 	// 用来测试描述词组set中相关fd 的位是否为真
void FD_SET(int fd, fd_set *set); 	// 用来设置描述词组set中相关fd的位
void FD_ZERO(fd_set *set); 			// 用来清除描述词组set的全部位

2.3 timeval结构

timeval结构用于描述一段时间长度,如果在这个时间内,需要监视的描述符没有事件发生则函数返回,返回值为0。

/* A time value that is accurate to the nearestmicrosecond but also has a range of years.  */
struct timeval{__time_t tv_sec;		/* Seconds.  */__suseconds_t tv_usec;	/* Microseconds.  */};

2.4 函数返回值

  1. 执行成功则返回文件描述词状态已改变的个数,
  2. 如果返回0代表在描述词状态改变前已超过timeout时间,没有返回
  3. 当有错误发生时则返回-1,错误原因存于errno,此时参数readfds,writefds, exceptfds和timeout的值变成不可预测。

错误值可能为:

  • EBADF 文件描述词为无效的或该文件已关闭
  • EINTR 此调用被信号所中断
  • EINVAL 参数n 为负值。
  • ENOMEM 核心内存不足

3. 理解select执行过程

理解select模型的关键在于理解fd_set,取fd_set长度为1字节,fd_set中的每一bit位可以对应一个文件描述符fd。则1字节长的fd_set最大可以对应8个fd。

(1)执行fd_set set;FD_ZERO(&set);则set用位表示是0000,0000

(2)若fd=5,执行FD_SET(fd, &set);后set变为0001,0000(第5个bit位 置为1)

(3)若再加入fd=2,fd = 1,则set变为0001,0011

(4)执行select(6, &set, NULL, NULL, NULL) 阻塞等待。

(5)若fd = 1,fd = 2上都发生可读事件,则select返回,此时set变为0000,0011

注意:没有事件发生的fd = 5被清空。

4. socket就绪条件

4.1 读就绪

  1. socket内核中,接收缓冲区中的字节数 大于等于低水位标记SO_RCVLOWAT。此时可以无阻塞的读该文件描述符,并且返回值大于0;
  2. socket TCP通信中,对端关闭连接,此时对该socket读,则返回0;
  3. 监听的socket上有新的连接请求;
  4. socket上有未处理的错误;

4.2 写就绪

  1. socket内核中,发送缓冲区中的可用字节数(发送缓冲区的空闲位置大小),大于等于低水位标记SO_SNDLOWAT,此时可以无阻塞的写,并且返回值大于0;
  2. socket的写操作被关闭(close或者shutdown)。 对一个写操作被关闭的socket进行写操作,会触发SIGPIPE信号;
  3. socket使用非阻塞connect连接成功或失败之后;
  4. socket上有未读取的错误;

5. select的特点

  1. 可监控的文件描述符个数取决与sizeof(fd_set)的值。我的服务器上sizeof(fd_set)=128,每bit表示一个文件描述符,则我服务器上支持的最大文件描述符是128*8=1024。

  2. 将fd加入select监控集的同时,还要再使用一个数据结构fdarray[]保存放到select监控集中的fd

    • 一是用于再select 返回后,fdarray[]作为源数据和fd_set进行FD_ISSET判断。

    • 二是select返回后会把以前加入的但并无事件发生的fd清空,则每次开始select前都要重新从fdarray[]取得fd逐一加入(FD_ZERO最先),扫描fdarray[]的同时取得fd最大值maxfd,用于select的第一个参数。

6. select缺点

  1. 每次调用select,都需要手动设置fd集合,从接口使用角度来说也非常不便。
  2. 每次调用select,都需要把fd集合从用户态拷贝到内核态,这个开销在fd很多时会很大。
  3. 同时每次调用select都需要在内核遍历传递进来的所有fd,这个开销在fd很多时也很大。
  4. select支持的文件描述符数量太小。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/77447.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android app控制ros机器人四(调整界面布局)

半吊子改安卓&#xff0c;记录页面布局调整&#xff1a; 在ros-mobile基础上顶端增加一行&#xff0c;用于显示app名称和logo图像&#xff1b;修改标签页。 添加文字简单&#xff0c;但是替换图标长知识了&#xff0c;开始只是简单的把mipmap各个文件夹下的图片进行替换&…

XML 学习笔记 7:XSD

本文章内容参考自&#xff1a; W3school XSD 教程 Extensible Markup Language (XML) 1.0 (Second Edition) XML Schema 2001 XML Schema Part 2: Datatypes Second Edition 文章目录 1、XSD 是什么2、XSD 内置数据类型 - built-in datatypes2.1、基本数据类型 19 种2.1.1、基本…

Stable Diffusion - SDXL 模型测试 (DreamShaper 和 GuoFeng v4) 与全身图像参数配置

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/132085757 图像来源于 GuoFeng v4 XL 模型&#xff0c;艺术风格是赛博朋克、漫画、奇幻。 全身图像是指拍摄对象的整个身体都在画面中的照片&…

Windows11 家庭中文版关于本地组策略编辑器gpedit.msc找不到即打不开的解决办法(征诚小张售后实测有效)

Windows11 家庭中文版关于本地组策略编辑器gpedit.msc找不到即打不开的解决办法 根本原因&#xff1a;是因为Windows11家庭中文版的 版本系统没内置安装本地策略组编辑器 好了废话不多说 直接说解决办法 第一步 首先电脑上新建一个空文本文件 输入以下内容&#xff1a; echo o…

《cuda c编程权威指南》05 - cuda矩阵求和

目录 1. 使用一个二维网格和二维块的矩阵加法 1.1 关键代码 1.2 完整代码 1.3 运行时间 2. 使用一维网格和一维块的矩阵加法 2.1 关键代码 2.2 完整代码 2.3 运行时间 3. 使用二维网格和一维块的矩阵矩阵加法 3.1 关键代码 3.2 完整代码 3.3 运行时间 1. 使用一个二…

基于MFCC特征提取和HMM模型的语音合成算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022A 3.部分核心程序 ............................................................................ %hmm是已经…

VX-API-Gateway开源网关技术的使用记录

VX-API-Gateway开源网关技术的使用记录 官网地址 https://mirren.gitee.io/vx-api-gateway-doc/ VX-API-Gateway(以下称为VX-API)是基于Vert.x (java)开发的 API网关, 是一个分布式、全异步、高性能、可扩展、轻量级的可视化配置的API网关服务官网下载程序zip包 访问 https:/…

第二十二篇:思路拓展:如何打造高性能的 React 应用?

React 应用也是前端应用&#xff0c;如果之前你知道一些前端项目普适的性能优化手段&#xff0c;比如资源加载过程中的优化、减少重绘与回流、服务端渲染、启用 CDN 等&#xff0c;那么这些手段对于 React 来说也是同样奏效的。 不过对于 React 项目来说&#xff0c;它有一个区…

STM32(HAL)多串口进行重定向(printf函数发送数据)

目录 1、简介 2.1 基础配置 2.1.1 SYS配置 2.1.2 RCC配置 2.2 串口外设配置 2.3 项目生成 3、KEIL端程序整合 4、效果测试 1、简介 在HAL库中&#xff0c;常用的printf函数是无法使用的。本文通过重映射实现在HAL库多个串口可进行类似printf函数的操作。 2.1 基础配置 2.…

Selenium自动化测试框架的搭建

说 起自动化测试&#xff0c;我想大家都会有个疑问&#xff0c;要不要做自动化测试&#xff1f; 自动化测试给我们带来的收益是否会超出在建设时所投入的成本&#xff0c;这个嘛别说是我&#xff0c;即便是高手也很难回答&#xff0c;自动化测试的初衷是美好的&#xff0c;而测…

【子序列DP】CF1582 F1

Problem - F1 - Codeforces 题意&#xff1a; 思路&#xff1a; 很经典的套路 注意到ai只有500&#xff0c;且和子序列有关 因此设dp[j]为子序列异或和为 j 的结尾那个数的最小值 为什么要这么设计&#xff0c;因为要保证递增 Code&#xff1a; // LUOGU_RID: 119162215…

DevOps系列文章之 Docker 安装 NFS 服务器

Docker 安装 NFS 服务器 环境&#xff1a; 192.186.2.105 NFS 服务器 192.168.2.106 Client 客户端 安装 一、服务器端 https://github.com/f-u-z-z-l-e/docker-nfs-server 1、创建目录 mkdir /nfsdata mkdir -p /docker/nfs/2、启动脚本 vim start.sh# 内容 docker run …

零代码爬虫平台SpiderFlow的安装

什么是 Spider Flow &#xff1f; Spider Flow 是一个高度灵活可配置的爬虫平台&#xff0c;用户无需编写代码&#xff0c;以流程图的方式&#xff0c;即可实现爬虫。该工具支持多数据源、自动保存至数据库、任务监控、抓取 JS 动态渲染页面、插件扩展&#xff08;OCR 识别、邮…

微信小程序中的分包使用介绍

一、分包的好处 可以优化小程序首次启动的下载时间 在多团队共同开发时可以更好的解耦协作 主包&#xff1a;放置默认启动页面/TabBar 页面&#xff0c;公共资源/JS 脚本 分包&#xff1a;根据开发者的配置进行划分 限制&#xff1a;所有分包大小不超过 20M&#xff0c;单…

用Abp实现找回密码和密码强制过期策略

用户找回密码&#xff0c;确切地说是重置密码&#xff0c;为了保证用户账号安全&#xff0c;原始密码将不再以明文的方式找回&#xff0c;而是通过短信或者邮件的方式发送一个随机的重置校验码&#xff08;带校验码的页面连接&#xff09;&#xff0c;用户点击该链接&#xff0…

HTML 基础标签

前言 当今互联网时代&#xff0c;网页是我们获取信息、交流和展示自己的重要渠道之一。而HTML&#xff08;超文本标记语言&#xff09;作为构建网页的基础&#xff0c;学习掌握HTML标签成为了必不可少的技能。 标题标签 <h1>~<h6>&#xff1a;这是用来定义标题的…

VisualStudioWindows下 远程调试

前置条件 1、调试方与被调试方&#xff0c;以下简称调试方为A&#xff0c;被调试方为B。A与B双方能相互ping通 2、B需要运行RemoteDebugger服务&#xff0c;该程序位于C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\IDE\Remote Debugger下。 我这里是安装…

选择结构的学习

选择结构 思考以下问题&#xff1a; 常用的逻辑运算符及其作用&#xff1f; 请写出判断分数大于 60 并且分数小于 100 的表达式 if-else 选择结构执行的顺序是什么&#xff1f; 多重 if 选择结构的执行流程是怎样的&#xff1f; if 选择结构书写规范有哪些&#xff1f; 通过下…

设计模式、Java8新特性实战 - List<T> 抽象统计组件

一、背景 在日常写代码的过程中&#xff0c;针对List集合&#xff0c;统计里面的某个属性&#xff0c;是经常的事情&#xff0c;针对List的某个属性的统计&#xff0c;我们目前大部分时候的代码都是这样写&#xff0c;每统计一个变量&#xff0c;就要定义一个值&#xff0c;且…

刷脸登录(人工智能)

刷脸登录 理解刷脸登录的需求 理解刷脸登录的开发流程实现刷脸登录功能 浅谈人工智能 人工智能的概述 人工智能&#xff08;Artificial Intelligence&#xff09;&#xff0c;英文缩写为AI。它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门…