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>