`

IO复用(select和poll)简介

    博客分类:
  • Unix
阅读更多
Contains:
  • 1、select
  • 2、poll

I/O复用模型使用在下列网络应用场合:
  • 1、当客户处理多个FD时,必须使用I/O复用。
  • 2、一个客户同事处理多个套接字是可能的。
  • 3、如果一个TCP服务器处理多个socket。
  • 4、如果一个服务器处理多个协议。

非阻塞I/O使我们可以调用open、read、write这样的I/O操作,并使这些操作不会永远阻塞。如果这种操作不能完成,则立即出错返回,表示该操作如继续执行将被阻塞。
对于一个给定的FD有两种方法对其指定非阻塞I/O
  • 1、如果调用open获得描述符,则可制定O_NONBLOCK标志。
  • 2、对于已经打开的一个FD,则可调用fcntl,由该函数打开O_NONBLOCK文件状态标志。

一、select函数
#include <sys/select.h>
#include <sys/time.h>

int select(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset, const struct timeval *timeout);

返回:若有就绪的FD则为其数目,若超时则为0,若出错则为-1。

首先,介绍最后一个参数:
timeout,它告知内核等待所指定描述符中的任何一个就绪可花多长时间。
这个参数有三种可能:
  • 1、永远等待下去:仅在有一个FD准备好才返回。
  • 2、等待一段固定时间:在一段时间范围内,有准本好的FD时返回。
  • 3、根本不等待:检查描述符后立即返回,这称为轮询(polling)。

中间的三个参数read setwritesetexcept set指定我们要让内核测试读、写和异常条件的FD
maxfdp1参数制定待测试的FD个数,它的值是待测试的MAX FD+1.
select使用描述符集,通常是一个整型数组。对应FD。
二、poll函数
#include <poll.h>

int poll(struct pollfd *fdarray, unsigned long nfds, int timeout);

返回:若有就绪的FD则为其数目,若超时则为0,若出错则为-1。

引用
与select不同,poll不是为每个状态构造一个描述符集,而是构造一个pollfd数组,每个数组元素指定一个描述符编号以及对其关心的状态。

struct pollfd {
     int fd;
     short events;
     short revents;
};


fdarray数组中的元素数由nfds说明。
events fd感兴趣的事件
revents fd已发生的事件
poll的最后一个参数说明我们愿意等待多少时间。如同select一样,有三种不同的情形。

有关select和poll的区别
可参考链接:
http://zh.wikipedia.org/wiki/Select_(Unix)

参考资料:
APUE
UNP 卷1
分享到:
评论

相关推荐

    网络io与io多路复用select/poll/epoll 服务器并发代码实现

    网络io与io多路复用select/poll/epoll 服务器并发代码实现

    IO复用:select,poll,epoll,kqueue的详细例子

    源码详解文章地址 https://blog.csdn.net/yadoufeng/article/details/130443058?spm=1001.2014.3001.5502

    IO多路复用之poll——完整代码

    三种IO多路复用机制: 一:select 二:poll 三:epoll 以上三种IO多路复用的完整代码,皆可以在我的资源列表中获取下载: 资源列表:http://download.csdn.net/user/qiulanzhu

    IO复用之select poll epoll的总结(推荐)

    下面小编就为大家带来一篇IO复用之select poll epoll的总结(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    IO多路复用之select——完整代码

    三种IO多路复用机制: 一:select 二:poll 三:epoll 以上三种IO多路复用的完整代码,皆可以在我的资源列表中获取下载: 资源列表:http://download.csdn.net/user/qiulanzhu

    linux内核select/poll,epoll实现与区别

    select,poll,epoll都是多路复用IO的函数,简单说就是在一个线程里,可以同时处理多个文件描述符的读写。 select/poll的实现很类似,epoll是从select/poll扩展而来,主要是为了解决select/poll天生的缺陷。 epoll在...

    Python3高级核心技术97讲-io复用 (select、poll 和 e.mp4

    Python3高级核心技术97讲-io复用 (select、poll 和 e.mp4

    IO多路复用之select_poll_epoll详解1

    2. Re:络通信 --&gt; IO多路复之sel 3. Re:络通信 --&gt; IO多路复之sel 3. 络通信 --&gt; IO多路复之selec 4. 数据库 --

    IO多路复用之epoll——完整代码

    三种IO多路复用机制: 一:select 二:poll 三:epoll 以上三种IO多路复用的完整代码,皆可以在我的资源列表中获取下载: 资源列表:http://download.csdn.net/user/qiulanzhu

    本项目包括利用多线程、select、poll以及epoll实现的并发处理连接请求

    poll:和select几乎没有区别,区别在于文件描述符的存储方式不同,poll采用链表的方式存储,没有最大存储数量的限制; epollepoll底层通过红黑树来描述,并维护一个ready list,将事件表中已经就绪的事件添加到这里...

    select poll epoll 代码实例

    select poll epoll 代码实例

    基于select、poll、epoll的区别详解

    linux提供了select、poll、epoll接口来实现IO复用,三者的原型如下所示,本文从参数、实现、性能等方面对三者进行对比。 代码如下: int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, ...

    udp多路IO模型.zip

    select,poll,epoll都是IO多路复用的机制,可以监测多个描述符,当某个或多个描述就绪,能够通知程序进行相应的读写行为。本demon是基于linux下udp通信实现,源码包括select、poll、epoll模型的udp服务端代码。

    非阻塞IO驱动和makefile

    在linux中常见IO复用的方法有select、poll...可以使用selectpoll和epoll中的任何一种,对于高并发的场合只使用epoll这一种。另外有别于阻塞IO,非阻塞IO的查询与读取是分开的,即先查询再读取,只有查询阶段是非阻塞的

    linux 下 select 编程 librtspserver

    linux 下 select 编程 我们知道 select 是IO 多路复用的一个最简单支持,poll 和 epoll 是 select 的升级版。在 UNIX 网络编程第五章读书笔记 我们遇到这样一个问题:当客户端阻塞在 fgets() 等待客户输入的时候,...

    IO多路复用之poll全面总结(必看篇)

    poll和select同样存在一个缺点就是,包含大量文件描述符的数组被整体复制于用户态和内核的地址空间之间,而不论这些文件描述符是否就绪,它的开销随着文件描述符数量的增加而线性增大。 2、poll函数 函数格式如下所...

    优于select的epoll1

    1. 实现IO复用的传统方法select和poll,但是性能不满意,因此有Linux的epoll,BSD的kqueue,Solaris的/dev/poll,Wi

    IO多路复用之epoll全面总结(必看篇)

    epoll是在2.6内核中提出的,是之前的select和poll的增强版本。相对于select和poll来说,epoll更加灵活,没有描述符限制。epoll使用一个文件描述符管理多个描述符,将用户关系的文件描述符的事件存放到内核的一个事件...

    Linux IO的水平触发和边缘触发的区别

    允许在任意时刻重复检测IO的状态.select,poll就属于水平触发.  边缘触发:如果文件描述符自上次状态改变后有新的IO活动到来,此时会触发通知.在收到一个IO事件通知后要尽可能多的执行IO操作,因为如果在一次通知中...

Global site tag (gtag.js) - Google Analytics