首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

linux中epoll用法

epoll 是 Linux 下用于处理大量文件描述符(比如网络连接)的高效 I/O 事件通知机制。它是 selectpoll 的替代品,特别适合在需要处理大量并发连接的场景中使用,如高性能的网络服务器。

基本用法

代码语言:txt
复制
#include <sys/epoll.h>
#include <unistd.h>

// 创建一个 epoll 实例
int epoll_fd = epoll_create1(0);
if (epoll_fd == -1) {
    // 错误处理
}

// 准备一个 epoll 事件结构体
struct epoll_event event;
event.events = EPOLLIN; // 关注可读事件
event.data.fd = socket_fd; // 要监听的文件描述符,比如一个 socket

// 将事件添加到 epoll 实例中
if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, socket_fd, &event) == -1) {
    // 错误处理
}

// 等待事件发生
struct epoll_event events[MAX_EVENTS];
int num_events = epoll_wait(epoll_fd, events, MAX_EVENTS, -1); // -1 表示无限等待
if (num_events == -1) {
    // 错误处理
}

// 处理发生的事件
for (int i = 0; i < num_events; i++) {
    if (events[i].events & EPOLLIN) {
        // 可读事件处理
    }
    // 其他事件处理...
}

// 关闭 epoll 实例
close(epoll_fd);

优势

  1. 效率高epoll 使用红黑树和就绪队列来管理文件描述符,使得添加、删除和查找操作的时间复杂度都是 O(1),而 selectpoll 的时间复杂度是 O(n)。
  2. 扩展性好epoll 没有最大文件描述符数量的限制,而 selectpoll 受到 FD_SETSIZE 的限制。
  3. 通知机制epoll 采用事件驱动的方式,只有当文件描述符就绪时才会通知应用程序,避免了 selectpoll 的轮询开销。

类型

  • EPOLLRDHUP:表示对端套接字关闭连接,或者关闭写操作的情况。
  • EPOLLEXCLUSIVE:用于设置独占模式,同一时刻只有一个进程能接收事件。
  • EPOLLONESHOT:只监听一次事件,事件发生后需要再次注册。
  • EPOLLET:设置边缘触发(Edge Triggered)模式,只告诉应用程序哪些文件描述符刚刚变为就绪状态。

应用场景

  • 高性能的网络服务器,如 Nginx、Redis 等。
  • 需要处理大量并发连接的客户端应用。

注意事项

  • 在使用 epoll 时,需要注意处理 EINTR 错误,即系统调用被信号中断的情况。
  • 在边缘触发模式下,需要确保非阻塞 I/O 的使用,以避免因为数据未完全读取或写入而导致的阻塞。
  • 合理设置 epoll_wait 的超时时间,以平衡响应性和 CPU 使用率。
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Linux中epoll IO多路复用机制

epoll简介 epoll 是Linux内核中的一种可扩展IO事件处理机制,最早在 Linux 2.5.44内核中引入,可被用于代替POSIX select 和 poll 系统调用,并且在具有大量应用程序请求时能够获得较好的性能...当创建好epoll句柄后,它就是会占用一个fd值,在linux下如果查看/proc/进程id/fd/,是能够看到这个fd的,所以在使用完epoll后,必须调用close() 关闭,否则可能导致fd被耗尽...epoll_create() 的返回值,第二个参数表示动作,使用如下三个宏来表示: [cpp] EPOLL_CTL_ADD //注册新的fd到epfd中; EPOLL_CTL_MOD...//修改已经注册的fd的监听事件; EPOLL_CTL_DEL //从epfd中删除一个fd; 第三个参数是需要监听的fd,第四个参数是告诉内核需要监听什么事,struct epoll_event...select支持的句柄数是有限制的, 同时只支持1024个,这个是句柄集合限制的,如果超过这个限制,很可能导致溢出,而且非常不容易发现问题, TAF就出现过这个问题, 调试了n天,才发现:)当然可以通过修改linux

1.5K90
  • 从linux源码看epoll

    前言 在linux的高性能网络编程中,绕不开的就是epoll。和select、poll等系统调用相比,epoll在需要监视大量文件描述符并且其中只有少数活跃的时候,表现出无可比拟的优势。...epoll能让内核记住所关注的描述符,并在对应的描述符事件就绪的时候,在epoll的就绪链表中添加这些就绪元素,并唤醒对应的epoll等待进程。...本文就是笔者在探究epoll源码过程中,对kernel将就绪描述符添加到epoll并唤醒对应进程的一次源码分析(基于linux-2.6.32内核版本)。...epoll中相应的描述符。...总结 epoll作为linux下非常优秀的事件触发机制得到了广泛的运用。其源码还是比较复杂的,本文只是阐述了epoll读写事件的触发机制,探究linux kernel源码的过程非常快乐_。

    2.3K20

    Linux epoll 源码分析 3

    在上一篇文章 Linux epoll 源码分析 2 中,我们分析了 epoll_ctl 的 ep_insert 方法,在这里我们继续看下 ep_remove 和 ep_modify 方法。...(ep, epi); ... // 从eventpoll中的红黑树数据结构中移除 rb_erase_cached(&epi->rbn, &ep->rbr); ... // 如果epitem...return 0; } 该方法的逻辑和ep_insert方法里的逻辑比较像,它先覆盖epitem中epoll_event的旧值,然后检查该文件当前已经就绪的事件,如果这些事件中有我们感兴趣的事件,则把epitem...放到eventpoll的rdllist队列中,最后通知因调用epoll_wait堵塞的线程,它们可以继续执行了。...至此,epoll的所有逻辑都已讲完。 有关tcp在何种情况下,会通知给epoll何种事件,我们会在其他文章中详细讲解。

    1.8K30

    Linux epoll 源码分析 2

    继上一篇 Linux epoll 源码分析 1,我们来继续看下 epoll_ctl 方法。...由代码我们还能看到,如果op是EPOLL_CTL_ADD或EPOLL_CTL_MOD,内核会自动帮我们注册POLLERR和POLLHUP事件,这在epoll_ctl的man文档中也有提到。 7....如果ep_item_poll方法返回的事件中有我们感兴趣的事件,则将epitem实例放到eventpoll实例的rdllink列表中,然后调用 wake_up_locked 方法,通知那些因调用 epoll_wait...// include/linux/poll.h static inline void poll_wait(struct file * filp, wait_queue_head_t * wait_address...则将 epitem实例添加到eventpoll的rdllink队列中,然后再调用 wake_up_locked 方法,将那些因调用epoll_wait而阻塞的线程唤醒,告知它们可以到eventpoll实例的

    1.6K31

    Linux中符号的用法

    1.“;”分号用法 方式:command1 ; command2 用;号隔开每个命令, 每个命令按照从左到右的顺序,顺序执行, 彼此之间不关心是否失败, 所有命令都会执行。....“|”管道符用法 方式:command1 | command2 上一条命令的输出,作为下一条命令的参数传入 3.“&”符号用法 方式:command1 & &放在启动参数后面表示设置此进程为后台进程...4.“&&”符号用法 逻辑与的功能 方式:command1 && command2 [&& command3 ...] shell 在执行某个命令的时候,会返回一个返回值,该返回值保存在 shell 变量...中。当 $? == 0 时,表示执行成功;当 $? == 1 时(我认为是非0的数,返回值在0-255间),表示执行失败。...5.“||”符号用法 逻辑或的功能 方式:command1 || command2 [|| command3 ...] 只有在 || 左边的命令返回假(命令返回值 $?

    3.4K20

    Linux中ln的用法

    ln是linux中一个非常重要命令,它的功能是为某一个文件在另外一个位置建立一个同步的链接.当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的目录...文件系统链接 基本语法 ln的用法跟cp和mv相似: ln -s 注意 -s标志指定软链接。如果省略此标志,则默认情况下会创建硬链接。 您可以为文件和目录创建符号链接。...但是,符号链接的权限是从它们的源继承的,所以如果不使用sudo,您就不能在这个目录中写入或删除文件。...但您希望许多用户能够在/home/目录中访问此目录,则可以在/home/目录中创建指向的多个符号链接至/srv/www/example.com/public_html/。...如果您希望将Web服务器配置文件保留在版本控制中,以便可以在项目和服务器之间轻松更新和共享它们,则可以将文件保存在主目录中的Git存储库中,并为NGINX或Apache配置创建符号链接目录: mkdir

    3.4K60

    【在Linux世界中追寻伟大的One Piece】多路转接epoll(续)

    1 -> epoll的工作方式 epoll有2中工作方式: 水平触发(LT) 边缘触发(ET) 加入有这样一个例子: 已经把一个tcp_socket添加到epoll描述符。...如上面的例子,由于只读了1K的数据,缓冲区中还剩1K的数据,在第二次调用epoll_wait时,epoll_wait仍然会立刻返回并通知socket读事件就绪。...客户端发送了下一个请求,epoll_wait才会返回,才能去读缓冲区中剩余的数据。...只要缓冲区中的数据没读完,就能够让epoll_wait返回文件描述符读就绪。 4 -> epoll的使用场景 epoll的高性能,是有一定的特定场景的。...如果场景选择的不适宜,epoll的性能可能适得其反。 对于多连接,且多连接中只有一部分连接比较活跃时,比较适合使用epoll。

    5510
    领券