欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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]

#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
相关标签: unix