首页 > 其他分享 >IO多路复用 select

IO多路复用 select

时间:2023-11-02 23:55:35浏览次数:45  
标签:文件 多路复用 检测 集合 描述符 IO 缓冲区 select

目录

select函数原型

使用select这种IO多路转接方式需要调用一个同名函数select,这个函数是跨平台的,Linux、Mac、Windows都是支持的。程序猿通过调用这个函数可以委托内核帮助我们检测若干个文件描述符的状态,其实就是检测这些文件描述符对应的读写缓冲区的状态:

  • 读缓冲区:检测里边有没有数据,如果有数据该缓冲区对应的文件描述符就绪
  • 写缓冲区:检测写缓冲区是否可以写(有没有容量),如果有容量可以写,缓冲区对应的文件描述符就绪
  • 读写异常:检测读写缓冲区是否有异常,如果有该缓冲区对应的文件描述符就绪
    委托检测的文件描述符被遍历检测完毕之后,已就绪的这些满足条件的文件描述符会通过select()的参数分3个集合传出,程序猿得到这几个集合之后就可以分情况依次处理了。
#include <sys/select.h>
struct timeval {
    time_t      tv_sec;         /* seconds */
    suseconds_t tv_usec;        /* microseconds */
};

int select(int nfds, fd_set *readfds, fd_set *writefds,
           fd_set *exceptfds, struct timeval * timeout);

  • 函数参数:
    • nfds:委托内核检测的这三个集合中最大的文件描述符 + 1
      内核需要线性遍历这些集合中的文件描述符,这个值是循环结束的条件
      在Window中这个参数是无效的,指定为-1即可

    • readfds:文件描述符的集合, 内核只检测这个集合中文件描述符对应的读缓冲区
      传入传出参数,读集合一般情况下都是需要检测的,这样才知道通过哪个文件描述符接收数据

    • writefds:文件描述符的集合, 内核只检测这个集合中文件描述符对应的写缓冲区
      传入传出参数,如果不需要使用这个参数可以指定为NULL

    • exceptfds:文件描述符的集合, 内核检测集合中文件描述符是否有异常状态
      传入传出参数,如果不需要使用这个参数可以指定为NULL

    • timeout:超时时长,用来强制解除select()函数的阻塞的
      NULL:函数检测不到就绪的文件描述符会一直阻塞。
      等待固定时长(秒):函数检测不到就绪的文件描述符,在指定时长之后强制解除阻塞,函数返回0
      不等待:函数不会阻塞,直接将该参数对应的结构体初始化为0即可。

  • 函数返回值:
    • 大于0:成功,返回集合中已就绪的文件描述符的总个数
    • 等于-1:函数调用失败
    • 等于0:超时,没有检测到就绪的文件描述符

细节

标签:文件,多路复用,检测,集合,描述符,IO,缓冲区,select
From: https://www.cnblogs.com/liviayu/p/17806573.html

相关文章

  • webpack4_CodeSplit——optimization.splitchunks
    目录代码文档树webpack.config.js通过修改entry来达到分割打包文件的目的通过optimization.splitChunks来分离大文件以及重复文件修改entry为单文件,在test.js文件中引入jquery配置optimization.splitchunks多入口情况下的多份大文件重复引入单入口情况下的文件单独打包参考博客代......
  • 相对全的fastio
    structFastIO{ staticconstintS=1048576; charbuf[S],*pL,*pR;intstk[20],Top; #defineClear()(fwrite(buf,1,Top,stdout),Top=0) #definegc()(pL==pR&&(pR=(pL=buf)+fread(buf,1,S,stdin),pL==pR)?EOF:*pL++) #definepc(ch)(((Top==S)&&a......
  • 【Azure Web Job】Azure Web Job执行Powershell脚本报错 The term 'Select-AzContext'
    问题描述AzureWebJob执行Powershell脚本报错 Select-AzContext:Theterm'Select-AzContext'isnotrecognizedasthenameofacmdlet,function,scriptfile,oroperableprogram.Checkthespellingofthename,orifapathwasincluded,verifythatthepa......
  • Veeam Backup & Replication 12 配置
    安装完后现在可以配置与备份vSphere相关的选项:1.RepositoryServer:用于存储备份文件的服务器。2.ProxyServers代理服务器:执行所有备份任务的服务器。3.VMwarevCenter凭据:此凭据用于连接并查看群集、主机、vApp和虚拟机。不需要vCenterServer,也支持独立ESXi主机。首次启动Veeam......
  • 深入理解Cookie与Session:实现用户跟踪和数据存储
    1.会话跟踪技术介绍会话:用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束。一次会话中可以包含多次请求和响应.HTTP协议是无状态协议,每次同一浏览器向服务器请求时,服务器都会将该请求视为新的请求,因此我们需要会话跟踪技术来实现同一会话内数据共享思考:下图......
  • GPIO
    MOS管的管脚:G栅极、S源极、D漏极MOS管的种类:N-MOS管、P-MOS管N-MOS管高电压导通,低电压断开,用来控制与地之间的导通P-MOS管低电压导通,高电压断开。用来控制与电源之间的导通位操作符操作寄存器  GPIO的推挽模式:输出的低电平为0伏,高电平为3.3伏,一般应用子啊需要......
  • Java NIO包结构简介
    layout:postread_time:trueshow_date:truetitle:JavaNIO包结构date:2023-07-0910:12:10-0600description:JavaNIO包结构简述.img:posts/java-nio/cover.pngtags:[java,IO,JavaNIO,ChannelIO,Buffer,threadsafty,multiplexer,charset]author:尹......
  • 11月2日GIL机制、计算密集型和io密集型
    目录CPythonGIL机制Jython、IronPython和PyPy(了解)为什么要有GIL机制例子计算密集型io(输入/输出)密集型CPythonCPython是Python的一种实现,它是官方解释器之一,而Python是编程语言本身的名称。然后CPython里面就有一个机制GIL(全局解释器锁),它是CPython中的一个重要特性,它对多线程......
  • 19.10 Boost Asio 同步文件传输
    在原生套接字编程中我们介绍了利用文件长度来控制文件传输的方法,本节我们将采用另一种传输方式,我们通过判断字符串是否包含goodbyelyshark关键词来验证文件是否传输结束了,当然了这种传输方式明显没有根据长度传输严谨,但使用这种方式也存在一个有点,那就是无需确定文件长度,因为无需......
  • CF1868B2 Candy Party (Hard Version) 题解
    Problem-1868B2-CodeforcesCandyParty(HardVersion)-洛谷相信大家已经看过SimpleVersion,这题和上题不同之处就在于如果\(b_i=2^x\),他可以被分解成\(2^x\)或\(2^{x+1}-2^x\),我们不妨起初固定一种方案,如果不满足条件后再把一部分换回去。我们强制钦定起......