EPOLL概述
来源:互联网 发布:数控激光切割机编程 编辑:程序博客网 时间:2024/05/17 01:41
一、epoll简介:
epoll仅仅是一个异步事件的通知机制,其本身并不作任何的IO读写操作,它只负责告诉你是不是可以读或可以写了,而具体的读写操作,还要应用层自己来作。它保持了事件通知与IO操作之间彼此的独立性,
二、相关函数:
1、epoll_create函数
函数声明:int epoll_create(int size)
该函数生成一个epoll专用的文件描述符,其中的参数是指定生成描述符的最大范围
2、epoll_ctl函数
函数声明:int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event)
该函数用于控制某个文件描述符上的事件,可以注册事件,修改事件,删除事件。
参数: epfd:由 epoll_create 生成的epoll专用的文件描述符;
op:要进行的操作例如注册事件,可能的取值EPOLL_CTL_ADD 注册、EPOLL_CTL_MOD 修改、EPOLL_CTL_DEL 删除
fd:关联的文件描述符;
event:指向epoll_event的指针;
如果调用成功返回0,不成功返回-1
3、epoll_wait函数
函数声明:int epoll_wait(int epfd,struct epoll_event * events,int maxevents,inttimeout)
该函数用于轮询I/O事件的发生;
参数:
epfd:由epoll_create 生成的epoll专用的文件描述符;
epoll_event:用于回传代处理事件的数组;
maxevents:每次能处理的事件数;
timeout:等待I/O事件发生的超时值;
返回发生事件数。
三、数据结构
typedef union epoll_data {
void *ptr;
int fd;
__uint32_t u32;
__uint64_t u64;
} epoll_data_t;
struct epoll_event {
__uint32_t events; /* Epoll events */
epoll_data_t data; /* User data variable */
};
结构体epoll_event 被用于注册所感兴趣的事件和回传所发生待处理的事件,
1、 epoll_data 联合体用来保存触发事件的某个文件描述符相关的数据,例如一个client连接到服务器,服务器通过调用accept函数可以得到与这个client对应的socket文件描述符,可以把这文件描述符赋给epoll_data的fd字段以便后面的读写操作在这个文件描述符上进行,*ptr: 通过指针ptr携带应用层数据, 当事件的通知到来时,它不仅告诉你发生了什么样的事件,还同时告诉这次事件所操作的数据是哪些。
2、 epoll_event 结构体的events字段是表示感兴趣的事件和被触发的事件可能的取值为:
EPOLLIN :表示对应的文件描述符可以读;
EPOLLOUT:表示对应的文件描述符可以写;
EPOLLPRI:表示对应的文件描述符有紧急的数据可读(这里应该表示有带外数据到来);
EPOLLERR:表示对应的文件描述符发生错误;
EPOLLHUP:表示对应的文件描述符被挂断;
EPOLLET:表示对应的文件描述符有事件发生。
注:关于epoll_event 结构体:
在函数epoll_ctl和epoll_wait中都用到了指向epoll_event结构体的指针,但是这两者的用途是不一样的。
1. 在epoll_ctl中的指针是指向一个epoll_event结构的,在这个epoll_event结构中设置关心的文件描述符和触发事件,当在这个文件描述符上发生了触发事件(例如可以读,EPOLLIN),epoll就知道这个在这个文件描述符有事件发生,可以做相应的操作。
2. 在epoll_wait中的指针是指向一个epoll_event结构数组的,用于回传代处理事件的数组;当执行此函数时,会发生阻塞,而当在某个(些)文件描述符上发生可以读写等事件时,此函数便会返回,返回值是可以进行读写等操作的文件描述符个数。此时并对epoll_event结构数组进行填充(例如对epoll_events[i].data.fd进行赋值,使其等于发生触发事件对应的文件描述符;对epoll_events[i]. events进行赋值,使其等于发生触发事件的类型),数组个数与函数返回值对应。此致,epoll的使命也就算完成了,因为epoll仅仅是一个异步事件的通知机制,告诉用户有哪些文件可以进行读写了,内容就保存在epoll_wait函数中指针所执行的epoll_event结构体数组中。接下来就由用户在这些文件上进行I/O操作了。
四、Epoll流程图
五、举例代码(待写)
【参考资料】
http://blog.csdn.net/zhengjie19/article/details/2260963 epoll使用
http://blog.csdn.net/zhengjie19/article/details/2260957 EPOLL的ET和LT模式
http://www.cnblogs.com/OnlyXP/archive/2007/08/10/851222.html epoll精髓
- EPOLL概述
- select和epoll 原理概述&优缺点比较
- linux epoll详解及使用方法概述
- select和epoll 原理概述&优缺点比较
- select和epoll 原理概述&优缺点比较
- epoll
- epoll
- epoll
- epoll
- epoll
- epoll
- epoll
- epoll
- epoll
- epoll
- epoll
- epoll
- epoll
- 一个简单实用的内存池实现之二 (C实现)
- Android音量seekbar制作
- 一个简单实用的内存池之一(c实现)
- java 使用正则Pattern等实现【搜索 -> 提取 -> 分割 -> 替换】功能
- 快开题了,想换个题目做
- EPOLL概述
- 求AOE网的关键路径
- 我在Salira的800天(2009.5.20~2011.7.29)-三.研究与学习篇
- mysql特殊查询
- 一个体现Java接口及工厂模式优点的例子
- 深入浅出C++之private/public/protected
- 菜鸟之驱动开发4
- VC程序的SECTION(3):.text
- 云参考框架 (大图)