套接字知识整理006-多路复用 select 发布人: sanye 时间: 2021-02-24 分类: 网络SOCKET编程 ## 前言 为何要使用 select 多路复用的场景 多路复用的含义 ### 什么是多路复用 >就是在任何一路 I/O 有“事件”发生的情况下,通知应用程序去处理相应的 I/O 事件,这样我们的程序就变成了“多面手”,在同一时刻仿佛可以处理多个 I/O 事件。 ### select 函数 > 使用 select 函数,通知内核挂起进程,当一个或多个 I/O 事件发生后,控制权返还给应用程序,由应用程序进行 I/O 事件的处理。 ``` int select(int maxfd, fd_set *readset, fd_set *writeset, fd_set *exceptset, const struct timeval *timeout); 返回:若有就绪描述符则为其数目,若超时则为0,若出错则为-1 ``` #### 参数 | 参数名 | 描述 | | ------------ | ------------ | | maxfd | 待测试的描述符基数,它的值是待测试的最大描述符加 1。 | | readset | 读描述符集合 | | writeset | 写描述符集合 | | exceptset | 异常描述符集合 | | timeval | 结构体时间 | 描述集合的宏 ```c++ void FD_ZERO(fd_set *fdset); void FD_SET(int fd, fd_set *fdset); void FD_CLR(int fd, fd_set *fdset); int FD_ISSET(int fd, fd_set *fdset); ``` 下面一个向量代表了一个描述符集合,其中,这个向量的每个元素都是二进制数中的 0 或者 1 ```c a[maxfd-1], ..., a[1], a[0] ``` | 宏 | 描述 | | :------------- | :------------- | | FD_ZERO | 将这个向量的所有元素都设置成 0 | | FD_SET | 把对应套接字 fd 的元素,a[fd]设置成 1 | | FD_CLR | 把对应套接字 fd 的元素,a[fd]设置成 0 | | FD_ISSET | 将这个向量的所有元素都设置成 0 | | FD_ZERO | 对这个向量进行检测,判断出对应套接字的元素 a[fd]是 0 还是 1 | |0|不需要处理| |1|需要处理| ### 套接字描述符就绪条件 > 内核通知我们套接字有数据可以读了,使用 read 函数不会阻塞 | 情况 | 描述 | | :------------- | :------------- | | 1 | 套接字接收缓冲区有数据可以读,如果我们使用 read 函数去执行读操作,肯定不会被阻塞,而是会直接读到这部分数据。 | |2|对方发送了 FIN,使用 read 函数执行读操作,不会被阻塞,直接返回 0| |3|针对一个监听套接字而言的,有已经完成的连接建立,此时使用 accept 函数去执行不会阻塞,直接返回已经完成的连接| |4|套接字有错误待处理,使用 read 函数去执行读操作,不阻塞,且返回 -1| ### select 检测套接字可写 > 基于套接字本身的特性来说,内核通知我们套接字可以往里写了,使用 write 函数就不会阻塞 | 情况 | 描述 | | :------------- | :------------- | | 1 | 套接字发送缓冲区足够大,如果我们使用套接字进行 write 操作,将不会被阻塞,直接返回。 | | 2 | 连接的写半边已经关闭,如果继续进行写操作将会产生 SIGPIPE 信号。 | | 3 | 套接字上有错误待处理,使用 write 函数去执行写操作,不阻塞,且返回 -1 | ### 总结 | 需要注意的点 | | :------------- | | 描述符基数是当前最大描述符 +1; | |每次 select 调用完成之后,记得要重置待测试集合。| 标签: int, 函数, 前言, 操作, 程序, fd_set, 描述, 阻塞, select 本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。 取消回复 添加新评论 阁下尊名? 📮邮箱(选填) 博客/主页(选填) 大侠请赐教 !支持Markdown格式 spam send以上是我的留言/建议,请查收! 上一篇: 套接字知识整理005-MSL TTL backlog 下一篇: 套接字知识整理007-poll 函数 -多路复用 apps format_list_bulleted publish 目录 标签 前言 系统 函数 代码 文件 核心 功能 内容 命令 事件 对象 组件 设计 程序 类型 业务 版本 变量 行 数据 分类 默认知识库数学知识库常数数学公式/推导数论统计学机器学习Prolog算法理论深度学习增强现实数据分析计算机知识库网络网络SOCKET编程网络安全nginx汇编/二进制架构设计UML图架构心经范式编程函数式Erlang面向对象JavaC++coding技巧存储中间件MySQL mongodb虚拟化技术Docker操作系统/运维RHCA笔记RHCEAnsible小书常用命令windowslinux编译技术编译原理客户端ios大前端TypeScriptnodejsangularng8Vue浏览器API建筑知识库