本文节转自: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概述 在Linux网络编程中,早期广泛使用的事件触发机制主要是基于`select`。然而随着技术的发展以及应用需求的提高,`select`逐渐暴露出了一些明显的局限性,比如它对于大量文件...
《Epoll模型详解》 Epoll是Linux内核提供的一种高效、可扩展的I/O事件通知机制,尤其在处理大量并发连接时表现出显著优势。它替代了传统的select和poll方法,解决了这些方法在处理大量文件描述符(fd)时效率低下的...
**EPOLL模型详解** Linux 2.6内核引入了EPOLL模型,作为解决I/O多路复用问题的一种高效机制,特别是在处理大量socket描述符(FD)时。EPOLL对比传统的select和poll模型,具有以下显著优点: 1. **不受FD数量限制**...
《Epoll模型详解》 在Linux的网络编程领域,Epoll模型是替代传统select模型的一种高效解决方案。Epoll的优势在于其高效性和可扩展性,它避免了随着监听文件描述符(fd)数量增加而导致的性能下降问题。传统的select...
linux epoll 概念、优缺点、io复用 、脑图、Linux下的服务器模型:
linux c开发 epoll详解 异步事件处理 linux c开发 epoll详解 异步事件处理 linux c开发 epoll详解 异步事件处理 linux c开发 epoll详解 异步事件处理 linux c开发 epoll详解 异步事件处理
- **多线程环境下的同步问题**:在多线程环境下使用epoll,需要考虑线程安全问题,通常使用互斥锁(mutex)或条件变量(condition variable)来保护epoll实例的修改。 本示例的代码可能包含以下部分: - 文件描述符...
默认情况下,epoll使用LT模式,这意味着只要文件描述符处于就绪状态,每次epoll_wait都会报告该事件,直到应用处理完。而ET模式下,epoll只会在事件状态改变时报告一次,即使在事件处理过程中,文件描述符仍然就绪,...
【epoll模型详解】 在Linux网络编程中,epoll机制是一种高效的I/O事件通知机制,尤其在处理大量并发连接时,其性能优势显著。epoll是Linux内核为解决传统select和poll机制在高并发场景下性能下降的问题而设计的。...
Epoll通过`epoll_create()`创建一个Epoll实例,然后使用`epoll_ctl()`将感兴趣的文件描述符添加到Epoll实例中,并设置相应的事件类型。接着,通过`epoll_wait()`函数阻塞等待,当有事件发生时,`epoll_wait()`会返回...
Windows完成端口介绍 Linux EPOLL介绍 同步I/O与异步I/O 说起完成端口,它的实现机制其实是重叠I/O实现异步I/O操作,下面就结合同步I/O来解释下什么是异步I/O
**epoll详解:** epoll是Linux内核提供的I/O多路复用技术,用于替代传统的select和poll。epoll的优点在于它可以处理大量并发连接,并且具有更低的系统开销和更高的效率。epoll的工作原理包括以下几点: 1. **事件...
在Linux系统中,当面临需要同时管理大量网络连接或文件描述符时,`select`、`poll`和`epoll`是三种常见的I/O多路复用技术,它们允许程序在一个单独的线程中等待多个文件描述符的事件,提高了程序的效率和并发能力。...
**epoll服务器详解** 在Linux系统中,epoll是一种I/O多路复用技术,用于高效地处理大量的并发连接。它是poll和select方法的增强版本,尤其适合高性能、高并发的网络服务。本文将深入探讨epoll的工作原理、优势以及...
#### 二、`epoll_create`详解 `epoll_create`用于创建一个`epoll`对象,该对象用于后续注册文件描述符、修改或删除注册的文件描述符以及等待事件的发生。在内核层面,该操作主要通过`sys_epoll_create()`函数来实现...
#### /dev/epoll内核补丁详解 新式/dev/epoll内核补丁的主要思想是在每个文件描述符的数据结构中添加一个回调函数链表。具体来说,在`struct file`中新增了一个`struct list_head f_cblist;`成员变量,用于存储该...
2. **epoll接口详解** - `epoll_create`: 创建一个`epoll`实例,返回一个文件描述符。 - `epoll_ctl`: 添加、修改或删除监控的文件描述符,操作包括`EPOLL_CTL_ADD`、`EPOLL_CTL_MOD`和`EPOLL_CTL_DEL`。 - `...