多路复用,是一种机制,通过该机制可以监视多个描述符,内核一旦发现进程指定的一个或多个IO条件准备读取,就会通知该进程,就会准备好相应的I/O操作。
相比较于多进程和多线程,多路复用的优势在于系统开销小,因为系统不必创建进程或线程,因而也不必维护这些进程或线程,从而大大减少了系统的开销。
它适用的场合有:
(1)当用户处理多个描述字时,必须使用I/O复用;
(2)当一个客户同时处理多个套接口的时候,好在这种情况出现的可能性比较小。
select()函数:
头文件:#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
原型:int select(int n,fd_set * readfds,fd_set * writefds,fd_set * exceptfds,struct timeval * timeout)
功能:I/O多工机制
描述:用于等待文件描述符状态的改变,n代表最大的文件描述符加1,1;参数readfds,writefds和exceptfds称为描述符组,是用来回传该描述符的读写或例外的状况。
以下是宏提供处理这种描述符组的方式:
FD_CLR(int fd,fd_set *set):用来清除描述符组set中相关fd的位
FD_ISSET(int fd,fd_set *set):用来测试描述符组set中相关fd的位是否为真
FD_SET(int fd,fd_sets *set):用来设置描述符组set的全部位
FD_ZERO(fd_set *set):用来清除描述符组set的全部位
参数timeout为结构timeval,用来设置select()的等待时间,其结构定义如下:
struct timeval
{
time_t tv_sec;
time_t tv_usec;
};
如果参数timeout设为NULL则表示select()没有timeout.
返回值:执行成功,则返回文件描述符状态已经改变的个数,如果返回0代表着在描述符状态改变之前已经超过timeout的时间,当有错误发生的时候则返回-1,并将错误的原因保存在errno中,而此时参数readfds,writefds,exceptfds和timeout的值就变得不可预测。