一. 前言

IO 多路复用技术是指由进程通知内核监听指定的一个或多个 IO 事件,当 IO 事件发生时由内核通知唤醒进程,它一般用在一个进程需要同时监听处理多个 IO 事件的场景,与多进程或多线程的方式相比,使用 IO 多路复用技术无需创建多个进程或线程,减少系统开销。

本文将介绍 select 函数的用法,它允许进程通知内核监听多个 IO 事件,并在事件发生或者设置的超时时间到达时唤醒进程处理。

二. select

函数原型:

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

参数说明:

nfds:监听的所有文件描述符中最大的文件描述符加一

readfds:监听可读事件的文件描述符集合

writefds:监听可写事件的文件描述符集合

exceptfds:监听异常事件的文件描述符集合

readfds, writefds, exceptfds 分别表示读,写,异常事件的集合,可以直接使用 fd_set 创建一个 fd 集合变量,使用 FD_ZERO 清空集合,使用 FD_SET 把指定 fd 添加到集合中,使用 FD_CLR 把指定 fd 从集合中删除,使用 FD_ISSET 可以判断指定 fd 是否在集合中。如果不关心相应的事件,可以在调用该函数时直接传 NULL。FD_ZERO,FD_SET,FD_CLR,FD_ISSET 原型如下:

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); 

timeout:超时时间,timeval 结构如下。

struct timeval {long tv_sec;   // secondslong tv_usec;  // microseconds
};

当 timeout 设置为 NULL 表示一直等待,直到有至少一个事件发生时才返回。

当 timeout 设置为大于 0 的超时时间表示等待至少一个事件发生时才返回,但是超时时间到达时即使没有事件也会返回。

当 timeout 设置为 0 的超时时间(非 NULL)表示检查后立刻返回,即轮询的方式。

返回值说明:

成功情况下返回监听事件集合中产生了事件的数量,例如监听 3 个可读事件,3 个可写事件,3 个异常事件,实际发生 1 个可读事件 1 个,1 个可写事件,2 个异常事件,那么返回值为 4。

失败情况下返回 -1,并设置 errno。

IO多路复用(select)相关推荐

  1. linux IO多路复用 select epoll

    概念 IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取,它就通知该进程 通俗理解(摘自网上一大神) 这些名词比较绕口,理解涵义就好.一个epoll场景:一个酒吧服务员(一个线程),前 ...

  2. python3 异步 非阻塞 IO多路复用 select poll epoll 使用

    有许多封装好的异步非阻塞IO多路复用框架,底层在linux基于最新的epoll实现,为了更好的使用,了解其底层原理还是有必要的. 下面记录下分别基于Select/Poll/Epoll的echo ser ...

  3. linux平台IO多路复用 select接口使用例子

    这几天在学习net-snmp源码,里面封装了很多select函数调用,这里记录一下linux上select的用法以及相关接口. 先看接口: //头文件 #include <sys/select. ...

  4. IO多路复用select/poll/epoll详解以及在Python中的应用

    IO multiplexing(IO多路复用) IO多路复用,有些地方称之为event driven IO(事件驱动IO). 它的好处在于单个进程可以处理多个网络IO请求.select/epoll这两 ...

  5. IO多路复用 select、poll、epoll

    什么是IO多路复用 在同一个线程里面, 通过拨开关的方式,来同时传输多个(socket)I/O流. 在英文中叫I/O multiplexing.这里面的 multiplexing 指的其实是在单个线程 ...

  6. Linux网络编程 之 IO多路复用select(八)

    1. IO多路复用的概念 I/O多路复用是通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作. 2. select接口 #include & ...

  7. Python异步非阻塞IO多路复用Select/Poll/Epoll使用

    来源:http://www.haiyun.me/archives/1056.html 有许多封装好的异步非阻塞IO多路复用框架,底层在linux基于最新的epoll实现,为了更好的使用,了解其底层原理 ...

  8. IO多路复用select,poll epoll以及区别

    看这个一次读懂 Select.Poll.Epoll IO复用技术 文章来简单理解下,如果不是很明白的话,可以参考下面转的知乎上面白话文列子 作者:Leslie 链接:https://www.zhihu ...

  9. C语言 IO多路复用——select函数

    友链 可以实现并发的效果 gcc 1.c -o 1 -lpthread ctrl+f搜索服务端代码和客户端代码获取代码 IO多路复用,IO多路转接 简介 IO多路复用中的IO并不是指单纯的标准输入和输 ...

  10. PostgreSQL中的io多路复用--select和epoll实现

    某天和同事闲聊,同事发现一个现象,PostgreSQL在空闲状态时(没有active连接),主进程的pstack显示一直在调用/lib64/libc.so.6的__select_nocancel () ...

最新文章

  1. 【数据平台】Pytorch库初识
  2. php pdo 更新sql语句,增删改查sql语句及PDO数据库连接操作流程实例-2019年7月24日...
  3. 创建可调试,热加载的TypeScript+Koa工程
  4. cglib动态代理导致注解丢失问题及如何修改注解允许被继承
  5. 开源!让图像识别训练速度提升了8.7倍
  6. org.apache.http.NoHttpResponseException
  7. 调整oracle数据库编码
  8. 计算机鼠标左右键作用,win7电脑鼠标右键有什么功能和作用
  9. PyVistaVTK Data Model
  10. 【踩坑】XML转JSON中如何把单个元素转成数组
  11. C语言 PTA 时间换算
  12. 关于累加偶数奇数的c语言程序,c语言 在1-100之间,求所有奇数和偶数的个数和所有奇数和偶数的和(写到一个里面)...
  13. 从零开始学习Openwrt教程
  14. 从经济学看IT厂商为何争着向云计算厂商转型?
  15. Java实现 LeetCode 31下一个排列
  16. C语言中的0U或1U是什么意思?
  17. 11月22日训练题解
  18. 计算机绘图期末试题,21年5月份154北理工《机械制图2》期末试卷
  19. Localization 本地化与多语言支持
  20. [普通物理]波的能量与干涉

热门文章

  1. vue 高阶组件(HOC)
  2. AtCoder Beginner Contest 266 「A」「B 取模」「C 凸多边形」「D 状态机dp」「E 概率dp」「F 思维+dfs」
  3. iOS- 无处不在,详解iOS集成第三方登录(SSO授权登录无需密码)
  4. 智能硬件语音交互流程分析
  5. MySQL高级特性一:分区表
  6. python壁纸超清全面屏_这大概是你见过最全面的 Python 重点了
  7. python壁纸超清全面屏_小米MIX Alpha发布:全身都是屏、首发1亿像素相机
  8. 肖 sir_就业课__014python讲解
  9. 百度的Java面试题库,都有什么呢?
  10. EXFAT,FAT,NTFS优劣简述