poll函数
poll的机制与select类似,与select在本质上没有多大差别,管理多个描述符也是进行轮询,根据描述符的状态进行处理,但是poll没有最大文件描述符数
主旨思想:
- 首先要构造一个关于pollfd数组,将文件描述符和要检测的时间加入数组中
- 调用一个poll函数,监听pollfd数组中的文件描述符,直到这些描述符中的一个或者多个进行I/O操作时,该函数才返回。
a.这个函数是阻塞
b.函数对pollfd数组的文件描述符的检测的操作是由内核完成的 - 在返回时,它会告诉进程有多少个描述符要进行I/O操作。
#include <poll.h>//头文件
struct pollfd {
int fd; 委托内核检测的文件描述符
short events; 委托内核检测文件描述符的什么事件
short revents; 文件描述符实际发生的事件
};
//实例
struct pollfd myfd;
myfd.fd = 5;
myfd.events = POLLIN | POLLOUT;
int poll(struct pollfd *fds, nfds_t nfds, int timeout);
- 参数:
- fds : 是一个struct pollfd 结构体数组,这是一个需要检测的文件描述符的集合
- nfds : 这个是第一个参数数组中最后一个有效元素的下标 + 1
- timeout : 阻塞时长
0 : 不阻塞
-1 : 阻塞,当检测到需要检测的文件描述符有变化,解除阻塞
>0 : 阻塞的时长
- 返回值:
-1 : 失败
>0(n) : 成功,n表示检测到集合中有n个文件描述符发生变化
使用poll函数监听多个文件描述符的服务端程序
#include<stdio.h>
#include<stdlib.h>
#include<arpa/inet.h>
#include<string.h>
#include<unistd.h>

poll函数作为IO多路复用的一种方式,与select类似但无最大文件描述符限制。它通过pollfd数组管理多个描述符,由内核在后台检测。虽然能避免select的描述符数量限制,但存在用户态到内核态的数据拷贝及内核遍历开销问题。相比select,poll的优点在于没有文件描述符数量限制,但缺点包括返回后的文件描述符还需用户程序遍历确定。
最低0.47元/天 解锁文章
415

被折叠的 条评论
为什么被折叠?



