UNIX(编程-高级IO):05---IO复用(poll函数)

一、poll函数概念

  • poll函数类似于select函数,但是接口使用不同
  • poll函数可用于任何类型的文件描述符

二、poll函数结构

#include <poll.h>
int poll(struct pollfd fdarray[], nfds_t nfds, int timeout);

参数1

  • 与select不同,select是创建文件符集,并将文件符集放入参数2,3,4。poll函数是构建struct  pollfd的结构数组,数组中的每个结构含有文件描述符fd和该描述符的特性与条件
  • 注意:poll没有更改events成员。这与select不同,select修改其参数以指示哪一个描述符已准备好了
struct pollfd {
    int fd; /* file descriptor to check, or <0 to ignore */
    short events; /* events of interest on fd */
    short revents; /* events that occurred on fd */
};
  • fd:文件描述符
  • events:可以设置为下面表格中值的一个或多个,通过这些值告诉内核文件描述符的哪些事件
  • revnents:返回时,该成员由内核设置,用于说明每个描述符发生了哪些事件

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

当一个文件描述符被挂断(POLLHUP)后,就不能再写该描述符,但是有可能仍然可以从该描述符读到数据

参数2

  • 指定了参数1结构体数组的元素

参数3

 此参数最后一个参数说明我们想要等待多少时间。如同select一样,有三种不同的情形:

  • timeout == −1:永远等待。当所指定的描述符中的一个已准备好,或捕捉到一个信号则返回。如果捕捉到一个信号,则poll返回-1,errno设置为EINTR(某些系统在<stropts.h>中定义了常量INFTIM,其值为-1,也可以用这个常量) 
  • timeout == 0:不等待。测试所有描述符并立即返回。这是找到多个描述符的状态而不阻塞poll函数的轮询方法
  • timeout > 0:等待timeout毫秒。当指定的描述符之一已准备好,或指定的时间值已超过时立即返回。如果已超时但是还没有一个描述符准备好,则返回值是0。(如果系统不提供毫秒分辨率,则timeout值取整到最近的支持值)

三、poll的注意事项

应当理解文件结束与挂断之间的区别:

  • 如果正在终端输入数据,并键入文件结束字符, 那么就会打开POLLIN,于是我们就可以读文件结束指示( read返回0)
  • revents中的POLLHUP没有打开。如果正在读调制解调器,并且电话线已挂断,将在revents中将接到POLLHUP通知
  • 与select相同,一个描述符是否阻塞不会影响poll是否阻塞
  • select和poll的可中断性

Sigfunc *signal_intr(int signo, Sigfunc *func)
{
    struct sigaction act, oact;
    act.sa_handler = func;
    sigemptyset(&act.sa_mask);
    act.sa_flags = 0;
 
#ifdef SA_INTERRUPT
    act.sa_flags |= SA_INTERRUPT;
#endif
 
    if (sigaction(signo, &act, &oact) < 0)
        return(SIG_ERR);
    return(oact.sa_handler);
}
扫描二维码关注公众号,回复: 5923456 查看本文章

猜你喜欢

转载自blog.csdn.net/qq_41453285/article/details/89341430