重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
本文参考社长的 TinyWebServer 庖丁解牛
创新互联服务项目包括灌南网站建设、灌南网站制作、灌南网页制作以及灌南网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,灌南网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到灌南省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!
#include
int epoll_create(int size);
创建一个指示 epoll 内核事件表的文件描述符,该描述符将用作其他 epoll 系统调用的第一个参数,此处的 size 参数不起作用。
#include
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
该函数用于操作内核事件表监控的文件描述符上的事件:注册、修改、删除:
epfd
:为 epoll_create 的句柄;op
:表示动作,用 3 个宏来表示:
EPOLL_CTL_ADD
:注册新的 fd 到 epfd;EPOLL_CTL_MOD
:修改已经注册的 fd 的监听事件;EPOLL_CTL_DEL
:从 epfd 删除一个 fd;event
:告诉内核需要监听的事件。其中,event
是 epoll_event
结构体指针类型,表示内核监听的事件,具体定义如下:
struct epoll_event {
__uint32_t events;
epoll_data_t data;
};
events
描述事件类型,其中 epoll 事件类型有以下几种:
EPOLLIN
:表示对应的文件描述符可读(包括对端SOCKET正常关闭)EPOLLOUT
:表示对应的文件描述符可写;EPOLLPRI
:表示对应的文件描述符有紧急的数据可读(这里应该表示有带外数据到来)EPOLLERR
:表示对应的文件描述符发生错误;EPOLLHUP
:表示对应的文件描述符被挂断;EPOLLLET
:将 EPOLL 设置为边缘触发(ET)模式;EPOLLONESHOT
:只监听一次事件,当监听完这次事件之后,如果还需要继续监听这个 socket 的话,需要再次把这个 socket 加入到 EPOLL 队列中。#include
int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);
该函数用于等待所监控的文件描述符上有事件的产生,返回就绪的文件描述符的个数。
events
:用来存储内核得到的事件的集合;maxevents
:告知内核这个 events 有多大,这个值不能大于创建 epoll_create() 时的大小;timeout
:超时时间:
-1
:阻塞;0
:立即返回,非阻塞;>0
:指定毫秒数;调用函数
文件描述符数量
将文件描述符从用户传给内核:
内核判断就绪的文件描述符:
应用程序索引就绪文件描述符:
工作模式:
其实 ET 和 LT 哪个高效也是针对不同的任务而言。
应用场景:
LT 水平触发模式
Note:
一个事件只要有,就会一直触发。
socket 上只要有未读完的数据,就会一直产生 EPOLLIN 事件。所以读完数据要移除事件,避免一直触发。
ET 边缘触发模式
Note:
只有一个事件从无到有,才会触发。
socket 上每新来一次数据就会触发一次,如果某一次触发后,未将 socket 上的数据全部读完,也不会再次触发,除非再来一次数据。所以必须要一次性读完所有数据。如果未读完,需要再次将事件注册,
ET 模式必须配合非阻塞 I/O 实现,因为 ET 模式会一次性读取完所有的数据,如果是阻塞 I/O 的话,会导致线程阻塞,影响重新调用 epoll_wait 来监听其他事件。