一、select

I/O多路转接(select)是高级I/O的一种,阻塞IO,纪录锁,系统V流机制,I/O多路转接(poll/epoll),readv和writev函数以及存储映射IO(mmap),这些统称为高级IO。

select系统调用是用来让我们的程序监视多个文件句柄的状态变化的用来实现多路复用输入/输出模型。程序会停在select这里等待,直到被监视的文件句柄有一个或多个发生了状态改变。文件句柄,其实就是一个整数,我们最熟悉的句柄是0(标准输入),1(标准输出),2(标准错误输出)。对应的FILE *

结构的表示的就是stdin、stdout、stderr。

select函数:

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

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

常文件描述符的集合。

struct timeval结构体于描述一段时间长度,如果在这个时间内,需要监视的描述符没有事件

发生则函数返回,返回值为0。

下面的宏提供了处理这三种描述词组的方式:

FD_CLR(inr fd,fd_set* set);来清除描述词组set中相关fd 的位

FD_ISSET(int fd,fd_set *set);来测试描述词组set中相关fd 的位是否为真

FD_SET(int fd,fd_set*set);来设置描述词组set中相关fd的位

FD_ZERO(fd_set *set);来清除描述词组set的全部位

参数timeout为结构timeval,来设置select()的等待时间,其结构定义如下:

如果参数timeout设为: NULL:则表示select()没有timeout,select将一直被阻塞,直到某个文件描述符上发生了事件。 0:仅检测描述符集合的状态,然后立即返回,并不等待外部事件的发生。

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

函数返回值:

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

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

当有错误发生时则返回-1,错误原因存于errno,此时参数readfds,writefds,exceptfds和

timeout的值变成不可预测。错误值可能为:

EBADF 文件描述词为无效的或该文件已关闭

EINTR 此调用被信号所中断

EINVAL 参数n为负值。

ENOMEM 核心内存不足

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位置为1)

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

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

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

发生的fd=5被清空。

 基于上述的讨论,可以轻松得出select模型的特点:

  (1)可监控的文件描述符个数取决与sizeof(fd_set)的值。每bit表示一个文件描述符。

  (2)将fd加入select监控集的同时,还要再使用一个数据结构array保存放到select监控集

中的fd,一是用于在select 返回后,array作为源数据和fd_set进行FD_ISSET判断。二是select

返回后会把以前加入的但没有事件发生的fd清空,则每次开始 select前都要重新从array取得fd

逐一加入(FD_ZERO最先),扫描array的同时取得fd最大值maxfd,用于select的第一个参数。

  (3)可见select模型必须在select前循环array(加fd,取maxfd),select返回后循环array

(FD_ISSET判断是否有时间发)。

二、代码如下:

sever.c

client.c

运行结果:

select缺点:

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

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

(3)select支持的文件描述符数量太少了,默认是1024

转载于:https://blog.51cto.com/ab3813/1789295

I/O多路复用之select相关推荐

  1. 聊聊IO多路复用之select、poll、epoll详解

    聊聊IO多路复用之select.poll.epoll详解 2016/04/22 · IT技术 · 1 评论 · epoll, IO多路复用, poll, select 分享到:0 本文作者: 伯乐在线 ...

  2. python-IO多路复用,select模块

    触发机制:1)水平触发:2)边缘触发 IO多路复用单线程实现并发,实现模块:1)select(效率最低): 2)poll:3)epoll(最好,nginx的实现).linux下有这3种模块,windo ...

  3. IO多路复用之select全面总结(必看篇)

    转载:http://www.jb51.net/article/101057.htm 1.基本概念 IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取,它就通知该进程.IO多路复用适用如 ...

  4. 【python】-- IO多路复用(select、poll、epoll)介绍及实现

    IO多路复用(select.poll.epoll)介绍及select.epoll的实现 IO多路复用中包括 select.pool.epoll,这些都属于同步,还不属于异步 一.IO多路复用介绍 1. ...

  5. IO多路复用中select、poll、epoll之间的区别

    本文来说下IO多路复用中select.poll.epoll之间的区别 文章目录 什么是IO多路复用 为什么有IO多路复用机制 同步阻塞(BIO) 同步非阻塞(NIO) IO多路复用(现在的做法) 3种 ...

  6. Python之进程+线程+协程(事件驱动模型、IO多路复用、select与epoll)

    文章目录 一.事件驱动模型 二.IO多路复用 本篇文章是关于涉及网络编程与协程.进程之间结合的内容,其中事件驱动模型.IO多路复用.select与epoll的使用等方面的知识 一.事件驱动模型 1.事 ...

  7. 【C/C++服务器开发】文件,文件描述符,I/O多路复用,select / poll / epoll 详解

    文章目录 一.前言 1.文件的概念 2.文件描述符和文件指针 文件描述符 文件描述符和文件指针的区别 文件描述符太多了怎么办 二.I/O多路复用 1.I/O多路复用的由来 不要打电话给我,有需要我会打 ...

  8. Linux IO多路复用之Select简史

    内容目录 前言早期的UnixTCP/IP诞生后终端复用套接字章节回顾结论引用 前言 最近我一直在思考 Linux 中的多路复用,即 epoll(7)[1]系统调用.我很好奇 epoll与Windows ...

  9. IO多路复用之select篇

    1.基本概念 IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取,它就通知该进程.IO多路复用适用如下场合: (1)当客户处理多个描述字时(一般是交互式输入和网络套接口),必须使用I/ ...

  10. 【Linux系统编程】IO多路复用之select

    00. 目录 文章目录 00. 目录 01. 概述 02. select函数 03. select程序示例 04. select优缺点 05. 附录 01. 概述 I/O 多路复用技术是为了解决进程或 ...

最新文章

  1. Python的DataFrame多个条件过滤错误
  2. python 不得不知的第三方库以及常用安装包
  3. CTFshow php特性 web93
  4. IOS开发基础知识--碎片39
  5. Android 实现系统更新功能
  6. mac bash file密码_Mac系统 | 菜鸟程序员项目模拟数据迁移,会安装Mysql服务端吗
  7. 增加 jQueryValidate的手机号验证功能
  8. linux编译器项目,编译器架构 LLVM
  9. 动态规划——环形子数组的最大和(Leetcode 918)
  10. e5 e3 php,硬件百科:E3/E5为什么让“垃圾佬”痴迷
  11. 华为前员工李洪元:我的诉求只有见任总能解决;音悦台被传倒闭;.NET Core 3.1 发布 | 极客头条...
  12. 数学速算法64种口诀_小学数学有哪些数学计算技巧?
  13. DisplayLink 安装错误
  14. POSTman安装步骤
  15. win7计算机里找不到硬盘,win7系统重装时提示"找不到硬盘驱动器"的解决方法...
  16. hbase metric 监控项
  17. JSP解决:Attempt to clear a buffer that#39;s already been flushed错误(jsp:forward标签跳转空白)...
  18. Linux7安装keepalive,keepalive配置文件详解
  19. mysql怎样添加唯一标识_MySql设置唯一标识,主键等设置
  20. 小程序源码:紫色特别舒服的UI趣味测试-多玩法安装简单

热门文章

  1. 部门经常加班,该怎么办
  2. 金电容(法拉电容)与可充放电池的相关知识
  3. JQuery Mobile - 固定住页面和页脚
  4. angular4自定义组件非input元素实现ngModel双向数据绑定(转载)
  5. Android、IOS文字居中偏离的解决方案
  6. mysql not in 或 in 优化
  7. Ext.js入门:TabPanel组件(八)
  8. 【前端学习笔记】2015-09-02~~~~ 关于filter()匹配的使用
  9. C#调用非托管代码(C++方法)的2种方式
  10. Nginx 安装与运行