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精髓

 

 

原创粉丝点击