当前位置:网站首页>unix环境编程 第十四章 14.4 I/O多路转接

unix环境编程 第十四章 14.4 I/O多路转接

2022-08-09 10:26:00 玛丽苏打肉饼

14.4.1 函数select和pselect

#include <sys/select.h>
int select(int maxfdpl, fd_set *restrict readset, fd_set *restrict writeset, fd_set* restrict exceptset, struct timeval *restrict tvptr);

参数:struct timeval *restrict tvptr。

它指示愿意等待的时间长度,单位为秒和微妙。有以下三种情况:

  • tvptr==NULL。永远等待。如果捕捉到一个信号则中断此无限期等待。当所指定的描述符中的一个已准备好或捕捉到一个信号则返回。如果捕捉到一个信号,则select返回-1,errno设置为EINTR。
  • tvptr->tv_sec==0 && tvptr->tv_usec==0。根本不等待,测试所有指定的描述符并立即返回。
  • tvptr->tv_sec!=0 || tvptr->tv_usec!=0。等待指定的秒数和微妙数。当指定的描述符之一已准备好,或当指定的时间值已经超过时立即返回。如果在超时到期时还没有一个描述符准备好,则返回值时0。

中间三个参数:readfs,writefds,exceptfds是指向描述符集的指针。

这3个描述符集说明了我们关心的可读,可写或处于异常条件的描述符集合。每个描述符集存储在一个fd_set数据类型中。

在声明了一个描述符集之后,必须用FD_ZERO将这个描述符集置为0,然后在其中设置我们关心的各个描述符的位。

selece中间三个参数中的任意一个可以是空指针,这表示对相应条件并不关心。

select第一个参数maxfdp1的意思是“最大文件描述符编号值加1”。

select有三个可能的返回值

  • 返回值-1表示出错,在此情况下,一个描述符集都不修改。
  • 返回值0表示没有描述符准备好,此时所有的描述符集都会设置位0.
  • 一个正返回值说明了已经准备好的描述符数。该值是3个描述符集种已准备好的描述符数之和,所以如果同一描述符已准备好读和写,那么在返回值种会对其计两次数。

对于“准备好”的含义要做一些说明:

若对读集(readfds)中的一个描述符进行的read操作不会阻塞,则认为此描述符是准备好的。

若对写集(writefds)中的一个描述符进行的write操作不会阻塞,则认为此描述符是准备好的。

若对异常条件集中的一个描述符有一个未决异常条件,则认为此描述符集是主备好的。

对于读,写和异常条件,普通文件的文件描述符总是返回准备好。

14.4.2函数poll

poll函数和select函数类似,但是程序员接口有所不同。poll函数可以同于任何类型的文件描述符。

#include <poll.h>
int poll(struct pollfd fd[], nfds_t nfds, int timeout);
//返回值:准备就绪的描述符数目,若超时,返回0,若出错,返回-1

与select不同,poll不是为每个条件构造一个描述符集,而是构造一个pollfd结构的数组,每个数组元素指定一个描述符编号以及我们对改描述符感兴趣的条件。

struct pollfd{
  int fd;
  short events;
  short revents;
};

fdarray数组中的元素由数由nfds指定。

poll的events和revents标志:

标志名输入至events?从revents得到结果?说明
POLLINyesyes普通或优先级带数据可读
POLLRDNORMyesyes普通数据可读
POLLRDBANDyesyes优先级带数据可读
POLLPRIyesyes高优先级数据可读
POLLOUTyesyes普通数据可写
POLLWRNORMyesyes普通数据可写
POLLWRBANDyesyes优先级带数据可写
POLLERRyes发生错误
POLLHUPyes发生挂起
POLLNVALyes描述字不是一个打开的文件

 poll的最后一个参数指定的是我们愿意等待多长时间。

timeout==-1

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

timeout==0

不等待。测试所有描述符并立即返回。

timeout>0

等待timeout毫秒。当指定的描述符之一已经准备好,或者timeout到期时立即返回。如果timeout到期时还没有一个描述符准备好,则返回值时0.

 

原网站

版权声明
本文为[玛丽苏打肉饼]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_43873960/article/details/121275087