epoll和select学习记录

今天学习了一下epoll,先从自己的认知总结下epoll和select。

从平台来看,epoll仅适用于linux2.6以后,而select是windows和linux通用的,从应用方面来看,适用似乎都不是很复杂,然而select因为是通过数组实现,并发数是有上限的,而且效率会随着并发数提高而降低(因为需要通过遍历来获取数据是否发生变动)。而epoll因为采用红黑树存储数据,效率不可同日而语,而且获取数据变动无需遍历,直接可以获取到发生变化的数据集合。

epoll的三个函数:

int epoll_create(int size):建立并返回一个epoll对象,内核会为其建立一个文件对象,参数为建议的大小;

int epoll_ctl(int epfd,int op,int fd,struct epoll_event *event): 事件注册函数,向epoll注册特定的事件,如socket的写/读事件,第一个参数为create出来的epoll对象,第二个参数为表示操作,即EPOLL_CTL_ADD/EPOLL_CTL_DEL/EPOLL_CTL_MOD,分布表示添加,修改和删除,第三个为要监听的对象,一般是socket对象,第四个为一个结构体,表示要监听的事件和数据:

struct epoll_event {

 __uint32_t events; /* Epoll events */ 

 epoll_data_t data; /* User data variable */};

events 是 EPOLLIN/EPOLLOUT等表示监听对象当前可进行什么操作,events是一个union表示可操作的资源(如前面注册的socket),返回0或-1,分别表示成功和失败;

int epoll_wait(int epfd,struct epoll_event * events,int maxevents,int timeout):从函数名称就能看出此函数的作用是等待,等待注册的事件发生,第一个参数为epoll对象,第二个为epoll_event事件的数组,用来存放产生变化事件的集合,第三个参数为epoll_event数组的大小,原则上不能小于epoll对象的大小,第四个为超时事件,-1为阻塞,0为不等待,单位为ms,返回值为产生变化的事件个数;

暂时就熟悉了上面三个函数,离掌握还差的远,

代码片段:

关于select,也回顾下相关的几个函数:

首先初始化一个 fd_set结构体,用于存放需要监控的对象,然后需要将需要监控的对象加入到set中使用函数 FD_SET(int fd,fd_set*set),在这之前需要FD_ZERO(fd_set *set)将set清零。

然后就轮到主角出场了,int select(int n,fd_set * readfds,fd_set * writefds,fd_set * exceptfds,struct timeval * timeout),第一个参数为集合中对象个数之和加1,windows下可以随意设置,第2,3,4个分别指监控的读写和异常集合,第四个为超时,是一个结构体,分别是s和ms的组合,不赘述;

返回值-1为发生错误,0表示超时,正整数表示监控的对象可以操作,当返回正整数后,对set进行遍历,ISSET查询对象是否可操作,再进行对应的处理。

你可能感兴趣的:(epoll和select学习记录)