复用是什么? 顾名思义,复用就是一个进程多个作用。与单片机的IO口复用类似。
什么情况下要用I/O复用? 以下例举几种情况: 1、当客户机处理多个描述符时,必须使用I/O复用。 2、TCP服务器既要处理监听套接字,又要处理已连接套接字。 3、一个服务器既要处理TCP,又要处理UDP。 等等。。
如何实现复用?下面介绍两个常用的函数: 1、select函数 该函数允许进程指示内核等待多个事件中的任何一个发生,并只在有一个或多个事件发生或经历一段指定的时间后才唤醒它。支持的描述符数量默认是1024 函数原型:
int select(int maxfdpl,fd_set *readset,fd_set *writeset,fd_set *exceptest,const struct timeval *timeout);
参数: maxfdpl:指定待测试的描述符个数,它的值是待测试的最大描述符加1,描述符0,1,2…一直到maxfdpl-1将被测试。 readset,writeset,exceptest指定我们要让内核测试读、写和异常条件的描述符。 如何给这3个参数中的每一个参数指定一个或多个描述符值是一个设计上的问题。select使用描述符集,通常是一个整数数组,其中每个整数中的每一位对应一个描述符。对于这三个参数,如果我们对某一个的条件不感兴趣,就可以把它设为空指针。 timeout:它告知内核等待所指定描述符中的任何一个就绪可花多长时间。
返回值:所监听的所以监听集合中(三种)就绪的总数,若超时则为0,出错则为-1。
2、poll函数 poll提供的功能与select类似,不过在处理流设备时,它能够提供额外的信息。再就是poll没有描述符的数量限制。 函数原型:
int poll(struct pollfd *fdarray,unsigned long nfds,int timeout);
参数: fdarray:指向一个结构数组第一个元素的指针。每个数组元素都是一个pollfd结构,用于指定测试某个给定描述符fd的条件。
struct pollfd{
int fd;
short events;
short revents;
}
nfds:参数一数组中元素的个数。 timeout:指定poll函数返回前等待多长时间,是一个指定应等待毫秒数的正值。
|