I/O复用(poll)

本文介绍了IO复用的另一种实现——poll函数,它突破了select的1024文件描述符限制,实现了监听和就绪事件的分离。poll函数通过struct pollfd结构体监控文件描述符,其API包括参数、返回值等。尽管poll解决了某些问题,但在大量连接中仍有效率低下的问题,后续将探讨更高效的epoll函数。
摘要由CSDN通过智能技术生成

  上文说到的实现IO复用的函数中的select,本文接着介绍第二种poll。

poll

  Poll相对于select来说突破了监听的文件描述符上限1024,最大文件描述符是系统所能允许的最大值,可以通过查看proc/sys/fs/file-max文件查看,这个值也可以改(通过limits.conf)。另一方面是实现了监听和就绪事件的分离。其他和select类似,也是在指定时间内轮询一定数量的文件描述符,检测其中是否有就绪的。还是先从API说起。

poll API

函数原形:
# include <poll.h>
int poll ( struct pollfd * fds, unsigned int nfds, int timeout);
参数

poll函数的第一个参数fds是struct pollfd结构体类型的事件集,一般传入一个该类型的数组。
  pollfd结构体定义如下:

struct pollfd {

int fd;         /* 文件描述符 */
short events;         /* 等待的事件 */
short revents;       /* 实际发生了的事件,由内核填充 */
} ; 

该结构体有三个成员:
  第一个fds是要监听的文件描述符,
  第二个events是要监听的事件(POLLIN、POLLOUT、POLLERR),
  第三个revents是监控事件中满足条件返回的事件,内核通过修改这个参数来反馈监听的就绪事件。
  事件主要有以下几个:
  
  POLLIN         有数据可读。

  POLLRDNORM      有普通数据可读。

  POLLRDBAND      有优先数据可读。

  POLLPRI         有紧迫数据可读。

  POLLOUT       写数据不会导致阻塞。

  POLLWRNORM      写普通数据不会导致阻塞。

  POLLWRBAND      写优先数据不会

第二个参数nfds是监听的文件描述符的个数,
第三个参数timeout是设置超时时间,用法和select一样。是一个struct timeval结构体指针,该结构体定义如下:

struct timeval{

  long tv_sec;    //second

  long tv_usec;   //minisecond

  }

超时时间可以设置到毫秒级别,有三种设置情况:

  NULL:阻塞等待,直到某个文件描述符上发生了事件。

  0:仅检测描述符集合的状态,然后立即返回。

  > 0: 指定超时时间,如果在该时间段里没有事件发生,select将超时返回。

返回值

  

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值