I/O多路复用模型允许我们同时等待多个套接字描述符是否就绪。Linux系统为实现I/O多路复用提供的最常见的一个函数是select
函数,该函数允许进程指示内核等待多个事件中的任何一个发生,并只有在一个或多个事件发生或经历一段指定的时间后才唤醒它。
作为一个例子,我们可以调用select
,告知内核仅在下列情况发生时才返回:
- 当集合{0, 4}中任意描述符准备好读时返回
- 当集合{1, 2, 7}中任意描述符准备好写时返回
- 已经历了10.2秒
也就是说,我们调用select
可以告知内核我们对哪些描述符感兴趣以及等待多久时间。
select
是一个复杂的函数,有许多不同的应用场景,我们将只讨论第一种场景:等待一组描述符准备好读。
#include <unistd.h>
#include <sys/types.h>
int select(int n, fd_set *fdset, NULL, NULL, struct timeval *timeout);
FD_ZERO(fd_set *fdset); // 将fdset初始为为空集合
FD_CLR(int fd, fd_set *fdset); // 从fdset清除fd
FD_SET(int fd, fd_set *fdset); // 将fd添加到fdset
FD_ISSET(int fd, fd_set *fdset); // fd是否存在于fdset
我们来看下select
函数的参数。参数n
指定需要测试的描述符的数目,测试的描述符范围从0到n-1。第二个参数fdset
指定需要测试的可读描述符集合。当fds