深入理解 Linux epoll 中的 EPOLLRDHUP 事件
在开发高并发网络服务时,epoll无疑是 Linux 平台上最高效的 I/O 多路复用机制之一。然而,许多开发者对epoll事件中的EPOLLRDHUP却知之甚少,甚至完全忽略。这个事件看似简单,却是处理 TCP 连接关闭状态的一把“利器”。本文将系统性地讲解EPOLLRDHUP的触发条件、使用场景以及注意事项,帮助你写出更健壮、更高效的网络程序。一、EPOLLRDHUP 是什么?EPOLLRDHUP是 Linux 内核 2.6.17 引入的一个 epoll 事件标志,它用于检测对端已经关闭其写端,即对端不再发送数据。通俗来讲,这表示 TCP 连接收到了对端发来的FIN包,属于连接关闭流程中的半关闭(或全关闭)状态。与EPOLLIN、EPOLLOUT等常见事件不同,EPOLLRDHUP不会自动被监听,你必须在调用epoll_ctl()时显式地在events位掩码中包含该标志,才能捕获到它。二、EPOLLRDHUP 的触发条件根据 TCP 协议栈的行为,EPOLLRDHUP会在以下两种情况下被触发: