epoll机制:
epoll - I/O event notification facility: epoll-I/O事件通知工具
epoll是靠事件触发机制实现的功能,与任务轮询机制相比,优势就是:效率高,资源占用少。
#include <sys/epoll.h>
1 EPOLL功能
1)epoll_create函数
Int epoll_create(int size);
生成一个epoll专用的文件描述符,参数size是指定内核分配size个相关内核对象
创建好句柄后,会占用一个fd。Linux下可以通过/proc/进程id/fd/能查到对应的fd,使用完epoll后需要close();否则fd可能耗尽。
2)epoll_ctl函数
Int epoll_ctl(int epfd, int op , int fd , struct epoll_event *event );
用于控制某个文件描述符上的事件,可以注册事件,修改事件,删除事件。
3)epoll_wait函数
Int epoll_wait(int epfd, struct epoll_event *events, int maxevents , int timeout );
用于轮询I/O事件的发生
int epfd:Epoll专用描述符
int op:操作类型
EPOLL_CTL_ADD:注册新的fd到epfd中;
EPOLL_CTL_MOD:修改已经注册的fd的监听事件;
EPOLL_CTL_DEL:从epfd中删除一个fd;
int fd:关联的文件描述符,表示需要监听的fd
struct epoll_event *event :指向epoll_event指针,告诉内核需要监听什么事
int maxevents:每次能处理的事件数
int timeout:等待I/O事件的超时时间
2 EPOLL基本处理流程
1)应用创建Epoll对象
2)应用将关心对象的Epoll文件描述符及关注的事件以及发生的事件后的回调处理注册给Epoll对象
3)应用在阻塞点等待事件的发生,Epoll对象注册的关注集中任何对象发生改变都将结束阻塞点的等待
3 EPOLL优点
1)支持一个进程打开大数目的socket描述符(FD)
2)I/O效率不随FD数目增加而线性下降
epoll详解参考网址:https://blog.youkuaiyun.com/xiajun07061225/article/details/9250579