IO复用(select和poll)简介
程序员文章站
2022-05-28 10:45:53
...
[b]Contains:[/b]
[list]
[*]1、select
[*]2、poll
[/list]
[b]I/O复用模型使用在下列网络应用场合:[/b]
[list]
[*]1、当客户处理多个FD时,必须使用I/O复用。
[*]2、一个客户同事处理多个套接字是可能的。
[*]3、如果一个TCP服务器处理多个socket。
[*]4、如果一个服务器处理多个协议。
[/list]
非阻塞I/O使我们可以调用open、read、write这样的I/O操作,并使这些操作不会永远阻塞。如果这种操作不能完成,则立即出错返回,表示该操作如继续执行将被阻塞。
对于一个给定的FD有两种方法对其指定[b]非阻塞I/O[/b]:
[list]
[*]1、如果调用open获得描述符,则可制定O_NONBLOCK标志。
[*]2、对于已经打开的一个FD,则可调用fcntl,由该函数打开O_NONBLOCK文件状态标志。
[/list]
[b]一、select函数[/b]
返回:若有就绪的FD则为其数目,若超时则为0,若出错则为-1。
首先,介绍最后一个参数:
[b]timeout[/b],它告知内核等待所指定描述符中的任何一个就绪可花多长时间。
这个参数有三种可能:
[list]
[*]1、永远等待下去:仅在有一个FD准备好才返回。
[*]2、等待一段固定时间:在一段时间范围内,有准本好的FD时返回。
[*]3、根本不等待:检查描述符后立即返回,这称为轮询(polling)。
[/list]
中间的三个参数[b]read set[/b]、[b]writeset[/b]、[b]except set[/b]指定我们要让内核测试[b]读、写和异常[/b]条件的FD
[b]maxfdp1[/b]参数制定待测试的FD个数,它的值是待测试的MAX FD+1.
select使用描述符集,通常是一个整型数组。对应FD。
[b]二、poll函数[/b]
返回:若有就绪的FD则为其数目,若超时则为0,若出错则为-1。
[quote]与select不同,poll不是为每个状态构造一个描述符集,而是构造一个pollfd数组,每个数组元素指定一个描述符编号以及对其关心的状态。[/quote]
fdarray数组中的元素数由nfds说明。
events fd感兴趣的事件
revents fd已发生的事件
poll的最后一个参数说明我们愿意等待多少时间。如同select一样,有三种不同的情形。
有关select和poll的区别
可参考链接:
http://zh.wikipedia.org/wiki/Select_(Unix)
参考资料:
APUE
UNP 卷1
[list]
[*]1、select
[*]2、poll
[/list]
[b]I/O复用模型使用在下列网络应用场合:[/b]
[list]
[*]1、当客户处理多个FD时,必须使用I/O复用。
[*]2、一个客户同事处理多个套接字是可能的。
[*]3、如果一个TCP服务器处理多个socket。
[*]4、如果一个服务器处理多个协议。
[/list]
非阻塞I/O使我们可以调用open、read、write这样的I/O操作,并使这些操作不会永远阻塞。如果这种操作不能完成,则立即出错返回,表示该操作如继续执行将被阻塞。
对于一个给定的FD有两种方法对其指定[b]非阻塞I/O[/b]:
[list]
[*]1、如果调用open获得描述符,则可制定O_NONBLOCK标志。
[*]2、对于已经打开的一个FD,则可调用fcntl,由该函数打开O_NONBLOCK文件状态标志。
[/list]
[b]一、select函数[/b]
#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。
首先,介绍最后一个参数:
[b]timeout[/b],它告知内核等待所指定描述符中的任何一个就绪可花多长时间。
这个参数有三种可能:
[list]
[*]1、永远等待下去:仅在有一个FD准备好才返回。
[*]2、等待一段固定时间:在一段时间范围内,有准本好的FD时返回。
[*]3、根本不等待:检查描述符后立即返回,这称为轮询(polling)。
[/list]
中间的三个参数[b]read set[/b]、[b]writeset[/b]、[b]except set[/b]指定我们要让内核测试[b]读、写和异常[/b]条件的FD
[b]maxfdp1[/b]参数制定待测试的FD个数,它的值是待测试的MAX FD+1.
select使用描述符集,通常是一个整型数组。对应FD。
[b]二、poll函数[/b]
#include <poll.h>
int poll(struct pollfd *fdarray, unsigned long nfds, int timeout);
返回:若有就绪的FD则为其数目,若超时则为0,若出错则为-1。
[quote]与select不同,poll不是为每个状态构造一个描述符集,而是构造一个pollfd数组,每个数组元素指定一个描述符编号以及对其关心的状态。[/quote]
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为什么那么忙
下一篇: Centos7基础优化
推荐阅读
-
Python—IO多路复用之poll详解
-
Python—IO多路复用之select模块详解(select、poll、epoll之间的区别)
-
IO多路复用(二) -- select、poll、epoll实现TCP反射程序
-
IO复用之select poll epoll的总结(推荐)
-
Python—IO 多路复用之select详解
-
IO多路复用之select全面总结(必看篇)
-
IO多路复用之poll全面总结(必看篇)
-
深度理解select、poll和epoll
-
IO多路复用select/poll/epoll详解以及在Python中的应用
-
7.10 第九章I/O复用高级函数 select poll epoll(lt et)