Epoll源码解析
epoll_create()//创建内核时间表 容纳事件的容器
size(>0)没有意义 inode每一个文件都有自己的id
struct file 打开的文件
当创建好epoll句柄后,它就是会占用一个fd值
一、getfd 分配空闲的struct file,fd,struct inode,将fd和file关联起来
1.struct file
2.inode
3.fd
4.关联
根据file数组中所存放的fd来寻找指向的file结构体
内核事件表
二、分配struct eventpoll(用file中private data找到)定义的重要的数据结构 与struct file关联
1.Rdlist(就绪队列)
2.Rbr(红黑树)作为内核事件表,容纳描述符和事件
3.关联
用file中private data找到struct eventpoll
4.红黑树关联到struct epitem
三.struct inode
epoll_ctl() //向内核事件表中 添加 修改 移除 事件
判断添加描述符是否正确
tfile->f_op(操作)|| ! tfile->f_op->poll
判断文件是否正确
ep产生节点epi
对epi节点进行操作(增加,删除,修改)
实现Ep_insert时
ep_ptable_queue_proc
ep_poll_callback:注册回调函数,描述符就绪时调用
一旦基于某个文件描述符就绪时,内核会采用类似callback的回调机制,迅速激活这个文件描述符
回调函数:ep_poll_callback(将就绪的描述符放到就绪队列中)
把节点epi添加到树中
epoll_wait()//检查并获取就绪事件
maxevents:数组大小
Events:存放就绪事件的结构体数组
Ep_poll:
Eavail:
ep_events_transfer:
ep_collect_ready_items:收集就绪描述符和事件
ep_send_events:将就绪的事件传递给用户,传递前会再次检查事件是否就绪,拷出前再次检查是否就绪
Eventcnt为0,则不再读取
ep_reinject_items:
LT:拷出后返回再次加入到rdlist中
ET:不会再次返回