在上一篇博客中我们简单的select进行了实现,但是我们都知道select是早期的一个服务器,有缺点,缺点也很明显,它支持的文件描述符只有1024个是比较少的,所以当请求达到一定数量的时候,他就不能被称为高性能服务器了,他就会越来越慢知道挂掉;所以,我们来简单来介绍poll来对select进行改进;
poll的优缺点
优点
- poll不需要开发者来计算最大文件描述符+1
- poll在应付大数目的文件描述符的时候比select要快
- 它没有最大的连接数限制,它是基于链表来存储的
缺点 ####
- 大量的fd的数组被整体复制于用户态和内核态之间,而不管这样的复制是否有意义
- 与select一样,poll返回后需要轮询pollfd来获取就绪的文件描述符
poll介绍 ###
poll原型
#include<poll.h>
int poll(struct pollfd* fds, nfds_t nfds, int timeout);
第一个参数
struct pollfd
{
int fd; //文件描述符
short events; //注册的事件
short revents;//实际发生的事件,由内核填充
}
第二个参数
nfds:指定被监听事件集合;
第三个参数
timeout参数指定poll的超时值
-1:poll阻塞式等待
0 :poll调用立即返回
poll简单实现 ###
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <poll.h>
#define NUMBER_MAX_USER 1024
static void usage(