现在的位置: 首页 > 综合 > 正文

UNIX环境高级编程读书笔记(十二)—高级IO (2)

2014年03月15日 ⁄ 综合 ⁄ 共 1970字 ⁄ 字号 评论关闭

 

二.I/O多路转接

       如果我们想从多个文件描述符读或写数据,如果我们用以前学过的函数(read,write等)去处理可能会阻塞在一个文件描述符上,不能处理其他的文件描述符。那是因为我们以前学的I/O处理函数,都是阻塞的I/O处理函数,它们的特点是,如果缓冲区里有数据它们就会把数据写到文件中,如果缓存区没有数据他们就会等待(阻塞)直到有数据可读。这就造成了他们无法对多个文件描述符进行操作。而对多个文件描述符进行操作在网络通信方面却是执关重要的。

       一种比较好的解决方案就是I/O多路转接技术。它现构造一张有关文件描述符的列表,然后调用一个函数,直到这些描述符中的一个已经准备好进行I/O时,该函数才返回。在返回时,它告诉进程那些描述符已经准备好可以进行I/Opoll,selsct,pselect这三个函数使我们能够执行I/O多路转接,下面就分别介绍它们。

 

2

名称:

select

功能

指行I/O多路转接

头文件

#include <sys/select.h>

函数原形

int select(int maxfdpl,fd_set *restrict readfds,fd_set *restrict writefds,fd_set *testrict exceptfds,struct timeval *testrict tvptr);

参数

maxfdpl   最大描述符加1

readfds     读描述符集   

writefds    写描述符集

excepfds    异常描述符集

tvptr      愿意等待的时间

返回值:

准备就绪的文件描述符数,若超时则返回0,若出错则返回-1

      

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 select函数使我们可以执行I/O多路转接。传向select的参数告诉内核:我们所关系的描述符。对于每个描述符我们所关心的状态。以及我们愿意等待的时间。从select返回时,内核告诉我们:以准备好的描述符的数量。对于读、写或异常这三个状态中的每一个,那些描述符已经准备好。

       这个函数比较复杂,我们一个一个参数的看。

       第一个参数maxfdp1的意思是“最大描述符加1。也可将第一个参数设置为FD_SETSIZE,这是<sys/select.h>中的一个常数,它说明了最大的描述符数(经常是1024)。如果将第三个参数设置为我们所关注的最大描述符编号值加一,内核就只需在此范围内寻找打开的位,而不必在三个描述符集中的数百位内搜索。

       中间的三个参数readfdswritefdsexceptfds是指向描述符集的指针。这三个描述符集说明了我们关心的可读(readfds)、可写(writefd)或处于异常条件(wxcepfds)的各个描述符。每个描述符集存放在一个fd_set数据类型中。这种结构相当于一个描述符的数组,它为每个可能的描述符设置1位。

               fd0     fd1     fd2     fd3       fdn

0

0

0

0

readfdsà

 

               fd0     fd1     fd2     fd3       fdn

0

0

0

0

writefdsà

 

               fd0     fd1     fd2     fd3       fdn

0

0

0

0

excepfdsà

 

       可用下面4个函数对描述符集进行操作。

 

       select的中间三个参数中的任意一个或全部都可以是空指针,这表示对相应状态不关系。如果所有三个指针都是空指针,则select提供了较sleep更精确的计时器。其等待时间可以小于1秒。

      

       tuptr指定最后等待的时间,它的结构是:

struct timeval{

       long tv_sec;

       long tv_usec; 微秒

};

有三种情况:

(1) tvptr==NULL:永远等待。如果捕捉到一个信号则中断此无限等待。当所指定的描述符中的一个已经准备好或捕捉到一个信号则返回。如果捕捉到一个信号,则select返回-1errno设置为EINTR.

(2) tvptr->tv_sec==0&&tvptr_usec==0 完全不等待。测试所有的描述符并立即返回。这是得到多个描述符的状态而不阻塞select函数的轮询方法。

(3tvptr->tv_sec!=0||tvptr_usec!=0 等待指定的秒数或微秒数。当指定的描述符之一已准备好,或当指定的时间值已超过时立即返回。如果在超时还没有一个描述符准备好,则返回值是0

 

3

名称:

FD_ISSET/FD_CLR/FD_SET/FD_ZERO

功能

描述符集处理函数

头文件

#include <sys/select.h>

函数原形

<

抱歉!评论已关闭.