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

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

2012年03月17日 ⁄ 综合 ⁄ 共 1903字 ⁄ 字号 评论关闭

 

4

名称:

pselect

功能

指行I/O多路转接

头文件

#include <sys/select.h>

函数原形

int pselect(int masfdp1,fd_set *restrict readfds,fd_set *restrict writefds,fd_set excepfds,const struct timespec *restrict tsptr,const sigset_t *restrict sigmask);

参数

maxfdpl    最大描述符加1

readfds     读描述符集   

writefds    写描述符集

excepfds    异常描述符集

tsptr       愿意等待时间

sigmask    信号屏蔽集

返回值:

fd在描述符集中则返回非0值,否则返回0FD_ISSET

                                          pselectselect的一个变体,除以下几点外,pselectselect相同:

(1)       select的超时值用timeval结构指定,但pselect使用timespec结构指定。timespec以秒和纳秒表示超时值。

(2)       pselect的超时值被定义为const,这保证了调用pselect不会改变此值,。

(3)       对于paselect可以使用一可选的信号屏蔽字。若sigmask为空,那么在于信号有关的方面,pselectselect相同。否则,sigmask指向一信号屏蔽字,在调用pselect时,以原子操作的方式安装该信号屏蔽字。在返回时恢复以前的信号屏蔽字。

 

5

名称:

poll

功能

指行I/O多路转接

头文件

#include <sys/select.h>

函数原形

int poll(struct pollfd fdarray[],nfds_t nfds,int timeout);

参数

fdarray      存放描述符集的数组

nfds        fdarray数组元素个数

timeout     超时等待时间

返回值:

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

     

 

 

 

 

 

  poll类似于select,但是其接口则有所不同。poll不时为每个状态(可读性,可写性和异常状态)构造一个描述符集,而是构造一个pollfd结构的数组,每个数组元素指定一个描述符编号以及其所关心的状态。

struct pollfd{

       int fd; 文件描述符

       shout events;

       shout revents;

};

       fdarray数组中的元素由nfds说明。

应将每个数组元素的events成员设置为下表的值。通过这些告诉内核我们对该描述符关系的时什么。返回时,内核设置revents成员,以说明对于该描述符已经发生了什么事件。

 

标志名

说明

POLLIN

POLLRDNORM

POLLRDBAND

POLLPRI

不阻塞地可读除高优先级外的数据(等效于POLLRDNORM|POLLRDBAD

不阻塞地可读普通数据(优先级波段为0

不阻塞地可读非0优先级波段数据

不阻塞地可读高优先级数据

POLLOUT

POLLWRNORM

POLLWRBAND

不阻塞地可写普通数据

POLLOUT相同

不阻塞地可写非0优先级波段数据

POLLERR

POLLHUP

POLLNVAL

已出错

已挂断

描述符不引用一打开文件

       表头四行测试可读性,接着三行测试可写性,最后三行则是测试异常状态。最后三行是由内核在返回时设置的。即使在events字段中没有指定这三个值,如果相应条件发生,则在revents中也它们。

       当一个描述符被挂断后,就不能再写向该描述符。但是仍可能从该描述符读取数据。

poll的最后一个参数说明我们愿意等待多少时间。如同sellect一样,有三种不同情形:

      (1) timeout==-1永远等待,当所指定的描述符中的一个已准备好,或捕捉到一个信号时则返回。如果捕捉到一个信号,则poll返回-1error设置为EINTR.

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

       (3)timeout>0 等待timeout毫秒。当指定的描述符之一已准备好,或当指定的时间值已超过时立即返回。如果在超时还没有一个描述符准备好,则返回值是0

 

三、读写多个缓冲区

6

名称:

readv/writev

功能

散布读/聚集写

头文件

#include <sys/uio.h>

函数原形

抱歉!评论已关闭.