上一篇文章《网络编程之 select 详解》详细介绍了 select,而 poll 和 select 非常相似,本文将详细探讨 poll 的相关知识。
poll 是 Linux 中的字符设备驱动中的一个函数。poll 和 select 的实现机制类似,本质上没有多大差别,也是管理多个套接字文件描述符,也是由内核进行轮询并根据描述符的状态进行处理,但是 poll() 没有最大文件 描述符数量的限制,勉强算是select()函数的升级版。poll 的函数原型如下:
#include <poll.h>
int poll(struct pollfd *fds, nfds_t nfds, int timeout);
fds 是一个 pollfd 结构类型的数组的首地址,用于存放需要检测其状态的Socket描述符
nfds 监控数组中有多少文件描述符需要被监控
timeout 毫秒级等待
-1:阻塞等,#define INFTIM -1(Linux中没有定义此宏,可以自己定义)
0:立即返回,不阻塞进程
>0:等待指定毫秒数,如当前系统时间精度不够毫秒,向上取值
struct pollfd {
int fd; /* 文件描述符:用户设置关注的文件描述符(用户填充) */
short events; /* 监控的事件:用户关注的事件类型(用户填充) */
short revents; /* 监控事件中满足条件返回的事件:/由内核填充,就绪的事件类型 */
};
pollfd 结构监控的事件类型如下:
POLLIN 普通或带外优先数据可读,即POLLRDNORM | POLLRDBAND
POLLRDNORM 数据可读
POLLRDBAND 优先级带数据可读
POLLPRI 高优先级可读数据
POLLOUT 普通或带外数据可写
POLLWRNORM 数据可写
POLLWRBAND 优先级带数据可写
POLLERR 发生错误
POLLHUP 发生挂起
POLLNVAL 描述字不是一个打开的文件
详细代码示例参考 GitHub 开源代码 “IO Multiplexin\poll"部分,下载链接
poll 代码逻辑如下:
相对于 Linux 下 select 和 epoll,poll 特点如下:
相较于select而言,poll的优势:
缺点和select一样:
推荐一个零声学院免费公开课程,个人觉得老师讲得不错,
分享给大家:[Linux,Nginx,ZeroMQ,MySQL,Redis,
fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,
TCP/IP,协程,DPDK等技术内容,点击立即学习:服务器课程