I / O多路转接(I/O multiplexing),其基本思想是:先构造一张有关描述符的表,然后调用一个函数,它要到这些描述符中的一个已准备好进行 I / O时才返回.
在返回时,它告诉进程哪一个描述符已准备好可以进行 I / O。
一、什么是I/O Multiplexing?
I/O multiplexing就是我们说的select,poll,epoll,有些地方也称这种IO方式为event driven IO。其好处就在于单个process就可以同时处理多个网络连接的IO。
我们在这里仅仅来讨论select,它的基本原理就是会不断的轮询所负责的所有fdset,当某个fd有数据到达了,就通知用户进程来处理fd的读或者写事件。如果没有fd就绪,select会根据参数选择一直阻塞或者timeout。
I/O 多路复用的特点是通过一种机制一个进程能同时等待多个文件描述符,而这些文件描述符(套接字描述符)其中的任意一个进入读就绪状态,select()函数就可以返回。
二、select函数说明
|
|
下面的宏提供了处理这三种fd_set的方式:
FD_CLR(inr fd,fd_set set);用来清除描述词组set中相关fd 的位
FD_ISSET(int fd,fd_set set);用来测试描述词组set中相关fd 的位是否为真
FD_SET(int fd,fd_setset);用来设置描述词组set中相关fd的位
FD_ZERO(fd_set set);用来清除描述词组set的全部位
另外:
|
|
如果参数timeout设为:
- NULL,则表示select()没有timeout,select将一直被阻塞,直到某个文件描述符上发生了事件
- 0:仅检测描述符集合的状态,然后立即返回,并不等待外部事件的发生
- 特定的时间值:如果在指定的时间段里没有事件发生,select将超时返回
三、select函数返回值
执行成功则返回文件描述词状态已改变的个数,如果返回0代表在描述词状态改变前已超过timeout时间,没有返回;当有错误发生时则返回-1,错误原因存于errno,此时参数readfds,writefds,exceptfds和timeout的值变成不可预测。错误值可能为:
四、理解Select模型:
例如,我们若编写下列代码:
那么对应的fd_set模型为:
五、如何利用select设计的web服务器:
|
|