IO多路复用(select)
一. 前言
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)相关推荐
- linux IO多路复用 select epoll
概念 IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取,它就通知该进程 通俗理解(摘自网上一大神) 这些名词比较绕口,理解涵义就好.一个epoll场景:一个酒吧服务员(一个线程),前 ...
- python3 异步 非阻塞 IO多路复用 select poll epoll 使用
有许多封装好的异步非阻塞IO多路复用框架,底层在linux基于最新的epoll实现,为了更好的使用,了解其底层原理还是有必要的. 下面记录下分别基于Select/Poll/Epoll的echo ser ...
- linux平台IO多路复用 select接口使用例子
这几天在学习net-snmp源码,里面封装了很多select函数调用,这里记录一下linux上select的用法以及相关接口. 先看接口: //头文件 #include <sys/select. ...
- IO多路复用select/poll/epoll详解以及在Python中的应用
IO multiplexing(IO多路复用) IO多路复用,有些地方称之为event driven IO(事件驱动IO). 它的好处在于单个进程可以处理多个网络IO请求.select/epoll这两 ...
- IO多路复用 select、poll、epoll
什么是IO多路复用 在同一个线程里面, 通过拨开关的方式,来同时传输多个(socket)I/O流. 在英文中叫I/O multiplexing.这里面的 multiplexing 指的其实是在单个线程 ...
- Linux网络编程 之 IO多路复用select(八)
1. IO多路复用的概念 I/O多路复用是通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作. 2. select接口 #include & ...
- Python异步非阻塞IO多路复用Select/Poll/Epoll使用
来源:http://www.haiyun.me/archives/1056.html 有许多封装好的异步非阻塞IO多路复用框架,底层在linux基于最新的epoll实现,为了更好的使用,了解其底层原理 ...
- IO多路复用select,poll epoll以及区别
看这个一次读懂 Select.Poll.Epoll IO复用技术 文章来简单理解下,如果不是很明白的话,可以参考下面转的知乎上面白话文列子 作者:Leslie 链接:https://www.zhihu ...
- C语言 IO多路复用——select函数
友链 可以实现并发的效果 gcc 1.c -o 1 -lpthread ctrl+f搜索服务端代码和客户端代码获取代码 IO多路复用,IO多路转接 简介 IO多路复用中的IO并不是指单纯的标准输入和输 ...
- PostgreSQL中的io多路复用--select和epoll实现
某天和同事闲聊,同事发现一个现象,PostgreSQL在空闲状态时(没有active连接),主进程的pstack显示一直在调用/lib64/libc.so.6的__select_nocancel () ...
最新文章
- 【数据平台】Pytorch库初识
- php pdo 更新sql语句,增删改查sql语句及PDO数据库连接操作流程实例-2019年7月24日...
- 创建可调试,热加载的TypeScript+Koa工程
- cglib动态代理导致注解丢失问题及如何修改注解允许被继承
- 开源!让图像识别训练速度提升了8.7倍
- org.apache.http.NoHttpResponseException
- 调整oracle数据库编码
- 计算机鼠标左右键作用,win7电脑鼠标右键有什么功能和作用
- PyVistaVTK Data Model
- 【踩坑】XML转JSON中如何把单个元素转成数组
- C语言 PTA 时间换算
- 关于累加偶数奇数的c语言程序,c语言 在1-100之间,求所有奇数和偶数的个数和所有奇数和偶数的和(写到一个里面)...
- 从零开始学习Openwrt教程
- 从经济学看IT厂商为何争着向云计算厂商转型?
- Java实现 LeetCode 31下一个排列
- C语言中的0U或1U是什么意思?
- 11月22日训练题解
- 计算机绘图期末试题,21年5月份154北理工《机械制图2》期末试卷
- Localization 本地化与多语言支持
- [普通物理]波的能量与干涉
热门文章
- vue 高阶组件(HOC)
- AtCoder Beginner Contest 266 「A」「B 取模」「C 凸多边形」「D 状态机dp」「E 概率dp」「F 思维+dfs」
- iOS- 无处不在,详解iOS集成第三方登录(SSO授权登录无需密码)
- 智能硬件语音交互流程分析
- MySQL高级特性一:分区表
- python壁纸超清全面屏_这大概是你见过最全面的 Python 重点了
- python壁纸超清全面屏_小米MIX Alpha发布:全身都是屏、首发1亿像素相机
- 肖 sir_就业课__014python讲解
- 百度的Java面试题库,都有什么呢?
- EXFAT,FAT,NTFS优劣简述