`
20386053
  • 浏览: 432156 次
文章分类
社区版块
存档分类
最新评论

epoll使用详解

阅读更多

本文节转自:epoll使用详解(精髓)

在linux的网络编程中,很长的时间都在使用select来做事件触发。在linux新的内核中,有了一种替换它的机制,就是epoll。
相比于select,epoll最大的好处在于它不会随着监听fd数目的增长而降低效率。因为在内核中的select实现中,它是采用轮询来处理的,轮询的fd数目越多,自然耗时越多。并且,在linux/posix_types.h头文件有这样的声明:
#define __FD_SETSIZE 1024
表示select最多同时监听1024个fd,当然,可以通过修改头文件再重编译内核来扩大这个数目,但这似乎并不治本。

epoll的接口非常简单,一共就三个函数:

1. int epoll_create(int size);
创建一个epoll的句柄,size用来告诉内核这个监听的数目一共有多大。这个参数不同于select()中的第一个参数,给出最大监听的fd+1的值。需要注意的是,当创建好epoll句柄后,它就是会占用一个fd值,在linux下如果查看/proc/进程id/fd/,是能够看到这个fd的,所以在使用完epoll后,必须调用close()关闭,否则可能导致fd被耗尽。

2. int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
epoll的事件注册函数,它不同与select()是在监听事件时告诉内核要监听什么类型的事件,而是在这里先注册要监听的事件类型。第一个参数是epoll_create()的返回值,第二个参数表示动作,用三个宏来表示:
EPOLL_CTL_ADD:注册新的fd到epfd中;
EPOLL_CTL_MOD:修改已经注册的fd的监听事件;
EPOLL_CTL_DEL:从epfd中删除一个fd;
第三个参数是需要监听的fd,第四个参数是告诉内核需要监听什么事,struct epoll_event结构如下:

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 */
};

events可以是以下几个宏的集合:
EPOLLIN :表示对应的文件描述符可以读(包括对端SOCKET正常关闭);
EPOLLOUT:表示对应的文件描述符可以写;
EPOLLPRI:表示对应的文件描述符有紧急的数据可读(这里应该表示有带外数据到来);
EPOLLERR:表示对应的文件描述符发生错误;
EPOLLHUP:表示对应的文件描述符被挂断;
EPOLLET: 将EPOLL设为边缘触发(Edge Triggered)模式,这是相对于水平触发(Level Triggered)来说的。
EPOLLONESHOT:只监听一次事件,当监听完这次事件之后,如果还需要继续监听这个socket的话,需要再次把这个socket加入到EPOLL队列里

3. int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);
等待事件的产生,类似于select()调用。参数events用来从内核得到事件的集合,maxevents告之内核这个events有多大,这个 maxevents的值不能大于创建epoll_create()时的size,参数timeout是超时时间(毫秒,0会立即返回,-1将不确定,也有说法说是永久阻塞)。该函数返回需要处理的事件数目,如返回0表示已超时。

分享到:
评论

相关推荐

    Epoll模型详解

    Epoll模型详解

    Epoll模型详解.pdf

    Epoll模型详解.pdf

    Epoll模型详解借鉴.pdf

    Epoll模型详解借鉴.pdf

    Linux epoll模型详解.xmind

    linux epoll 概念、优缺点、io复用 、脑图、Linux下的服务器模型:

    epoll详解.doc

    linux c开发 epoll详解 异步事件处理 linux c开发 epoll详解 异步事件处理 linux c开发 epoll详解 异步事件处理 linux c开发 epoll详解 异步事件处理 linux c开发 epoll详解 异步事件处理

    EPOLL模型详解

    在一些 benchmark中,如果所有的socket基本上都是活跃的---比如一个高速LAN环境,epoll并不比select/poll有什么效率,相 反,如果过多使用epoll_ctl,效率相比还有稍微的下降。但是一旦使用idle connections模拟WAN...

    linux epoll机制详解

    主要介绍了linux epoll机制详解,介绍了select()和poll() IO多路复用模型,epoll IO多路复用模型实现机制,epoll的接口和工作模式等相关内容,小编觉得还是挺不错的,这里分享给大家,需要的朋友可以参考下

    谈谈select&poll&epoll.docx

    select,poll和epoll详解

    IO多路复用之epoll实例

    本示例演示了使用epoll函数处理多路IO复用。本示例在ubuntu + Qt下编译通过的,仅提供学习使用。

    通信模型详解,linux下通信EPOLL详解

    Windows完成端口介绍 Linux EPOLL介绍 同步I/O与异步I/O 说起完成端口,它的实现机制其实是重叠I/O实现异步I/O操作,下面就结合同步I/O来解释下什么是异步I/O

    epoll 模型详解

    描述epoll机制,配套代码,可以对epoll有个基本了解。

    epoll学习资料

    linux下的Tcp服务器,采用的是Epoll模式,linux下用epoll实现的udp服务器例子

    epoll源码剖析

    本文详细介绍了epoll的原理和Linux内核中如何实现epoll_create、epoll_ctl、epoll_wait.

    Epoll:epoll内核源码详解剖析,揭开epoll的神秘面纱-源码解析

    epoll内核源码详解剖析,揭开epoll的神秘面纱 为什么要剖析epoll原始码 在学习网络编程的过程中,在使用epoll的时候感觉epoll就像是神秘的魔法一样,可以创建百万的套接字句柄和以O(1)的时间复杂度返回允许的事件...

    epoll实现cs通信.zip

    epoll阻塞实现cs通信,内有注释详解

    epoll文档.zip

    epoll的优越性、详解、实例,讲的很详细

    IO多路复用之select_poll_epoll详解1

    2. Re:络通信 --> IO多路复之sel 3. Re:络通信 --> IO多路复之sel 3. 络通信 --> IO多路复之selec 4. 数据库 --

Global site tag (gtag.js) - Google Analytics