Contains:
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 set、
writeset、
except 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 服务器并发代码实现
源码详解文章地址 https://blog.csdn.net/yadoufeng/article/details/130443058?spm=1001.2014.3001.5502
三种IO多路复用机制: 一:select 二:poll 三:epoll 以上三种IO多路复用的完整代码,皆可以在我的资源列表中获取下载: 资源列表:http://download.csdn.net/user/qiulanzhu
下面小编就为大家带来一篇IO复用之select poll epoll的总结(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
三种IO多路复用机制: 一:select 二:poll 三:epoll 以上三种IO多路复用的完整代码,皆可以在我的资源列表中获取下载: 资源列表:http://download.csdn.net/user/qiulanzhu
select,poll,epoll都是多路复用IO的函数,简单说就是在一个线程里,可以同时处理多个文件描述符的读写。 select/poll的实现很类似,epoll是从select/poll扩展而来,主要是为了解决select/poll天生的缺陷。 epoll在...
Python3高级核心技术97讲-io复用 (select、poll 和 e.mp4
2. Re:络通信 --> IO多路复之sel 3. Re:络通信 --> IO多路复之sel 3. 络通信 --> IO多路复之selec 4. 数据库 --
三种IO多路复用机制: 一:select 二:poll 三:epoll 以上三种IO多路复用的完整代码,皆可以在我的资源列表中获取下载: 资源列表:http://download.csdn.net/user/qiulanzhu
poll:和select几乎没有区别,区别在于文件描述符的存储方式不同,poll采用链表的方式存储,没有最大存储数量的限制; epollepoll底层通过红黑树来描述,并维护一个ready list,将事件表中已经就绪的事件添加到这里...
select poll epoll 代码实例
linux提供了select、poll、epoll接口来实现IO复用,三者的原型如下所示,本文从参数、实现、性能等方面对三者进行对比。 代码如下: int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, ...
select,poll,epoll都是IO多路复用的机制,可以监测多个描述符,当某个或多个描述就绪,能够通知程序进行相应的读写行为。本demon是基于linux下udp通信实现,源码包括select、poll、epoll模型的udp服务端代码。
在linux中常见IO复用的方法有select、poll...可以使用selectpoll和epoll中的任何一种,对于高并发的场合只使用epoll这一种。另外有别于阻塞IO,非阻塞IO的查询与读取是分开的,即先查询再读取,只有查询阶段是非阻塞的
linux 下 select 编程 我们知道 select 是IO 多路复用的一个最简单支持,poll 和 epoll 是 select 的升级版。在 UNIX 网络编程第五章读书笔记 我们遇到这样一个问题:当客户端阻塞在 fgets() 等待客户输入的时候,...
poll和select同样存在一个缺点就是,包含大量文件描述符的数组被整体复制于用户态和内核的地址空间之间,而不论这些文件描述符是否就绪,它的开销随着文件描述符数量的增加而线性增大。 2、poll函数 函数格式如下所...
1. 实现IO复用的传统方法select和poll,但是性能不满意,因此有Linux的epoll,BSD的kqueue,Solaris的/dev/poll,Wi
epoll是在2.6内核中提出的,是之前的select和poll的增强版本。相对于select和poll来说,epoll更加灵活,没有描述符限制。epoll使用一个文件描述符管理多个描述符,将用户关系的文件描述符的事件存放到内核的一个事件...
允许在任意时刻重复检测IO的状态.select,poll就属于水平触发. 边缘触发:如果文件描述符自上次状态改变后有新的IO活动到来,此时会触发通知.在收到一个IO事件通知后要尽可能多的执行IO操作,因为如果在一次通知中...