IO复用——poll函数

东阳的学习笔记

poll提供的功能和 select 类似,不过在处理流设备时,它能提供额外的信息。

#include <poll.h>

int poll(struct pollfd *fdarray, unsigned long nfds, int timeout);

第一个参数时指向一个结构数组第一个元素的指针。每个数组元素都是一个pollfd结构,用于指定测试某个给定描述符fd的条件。

struct pollfd
{
	int fd;        /* descriptor to check */
	short events;  /* events of interest on fd */
	short revents; /* events occurred on fd */
}

要测试的条件由 events 成员指定,函数在相应的 revents 成员中返回描述的状态。这两个成员中的每一个都由指定某个特定条件的一位或多位构成。
在这里插入图片描述

常量说明
POLLIN普通或优先级带数据可读
POLLRDNORM普通数据可读
POLLRDBAND优先级带数据可读
POLLPRI高优先级数据可读
POLLOUT普通数据可写
POLLWRNORM普通数据可写
POLLWRBAND优先级带数据可写
POLLERR发生错误
POLLHUP发生挂起
POLLNVAL描述字不是一个打开的文件

就TCP和UDP套接字而言,以下条件引起poll返回特定的revent。不幸的是,POSIX在其poll的定义中留了许多空洞(也就是说有多种方法可返回相同的条件)。

  • 所有正规TCP数据和所有的UDP数据都被认为是普通数据
  • TCP带外数据(UNP第24章)被认为是优先级带数据。
  • TCP连接的读半部关闭时(譬如收到了一个来自对端的FIN),也被认为是普通数据,随后的读操作将返回0.
  • TCP连接存在错误, 即可以认为是普通数据,也可认为是错误(POLLERR)。无论哪种情况,随后的读操作将返回 -1,并把errno 设置为合适的值。
  • 在监听套接字上有新的连接可用既可认为是普通数据。也可认为是优先级数据。大多数人将其视为普通数据。
  • 非阻塞式connect的完成被认为是相应的套接字可写。

当发生错误时,poll函数的返回值为-1,若定时器到时之前没有任何描述符就绪,则返回0,否则返回就绪描述符的个数,即revents成员值非0描述值的个数

如果我们不再关心某个特定描述符,那么可以把与它对应的pollfd结构的fd成员设置成一个负值。poll函数将忽略这样的 pollfd 结构的 events 成员,返回时将它的 revents 成员置为0。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东阳z

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值