| 事件宏 | 觸發條件 | 說明 |
|---|---|---|
EPOLLIN | 可讀:新連線到達、資料到達、對端正常關閉 | 最常用,包含聽套接字接受連線 |
EPOLLOUT | 可寫:發送緩衝區有空間 | 通常只在需要寫入時註冊,寫完即移除 |
EPOLLPRI | 帶外資料(Urgent data,TCP OOB) | 極少用,需 SO_OOBINLINE 配合 |
EPOLLRDHUP | 對端關閉連線或半關閉(關閉寫端) | Linux 2.6.17+,檢測對端正常關閉的最佳方式 |
EPOLLERR | 套接體發生錯誤(本端錯誤) | 不需註冊,epoll_wait 永遠回報 |
EPOLLHUP | 套接體掛起(本端異常) | 不需註冊,epoll_wait 永遠回報 |
EPOLLIN(或 EPOLLET | EPOLLIN)。EPOLLIN。close()/kill/Ctrl+CEPOLLIN + EPOLLRDHUP**。EPOLLERR/EPOLLHUP(這兩者為本端錯誤)。recv() 回傳 0 → epoll_ctl(DEL) → close()。EPOLLRDHUP:僅依賴 EPOLLIN + recv()==0 判斷。SO_KEEPALIVE(系統級,預設 2 小時,可調整)。write()/send() → 觸發 EPOLLERR(發現對端已斷)。EPOLLPRI,不觸發 EPOLLIN。這兩個事件表示「本端(伺服器)發生錯誤/掛起」,而非對端斷開。只有當伺服器對已關閉的套接體進行
read/write時,才會在該套接體上觸發EPOLLERR,進而得知對端已不可用。
因此:不能依賴 EPOLLERR/EPOLLHUP 被動檢測對端異常斷開,必須結合心跳或定時探測。
| 模式 | 觸發條件 | 程式設計要求 |
|---|---|---|
| LT (預設) | 狀態滿足即持續觸發(如緩衝區有資料) | 簡單,可反覆處理 |
| ET | 狀態**變化**時觸發一次(資料從無到有) | **必須非阻塞 + 一次讀寫盡可能多** (loop until EAGAIN),否則資料遺漏 |
EPOLLET 與事件類型組合:EPOLLET | EPOLLIN。
事件觸發一次後**自動從 epoll 移除**,需手動 epoll_ctl(MOD) 重新註冊。用於**執行緒池分發任務**,確保同一連線同一時間僅由一執行緒處理。
EPOLLIN (LT) 即可。EPOLLIN | EPOLLRDHUP (LT) 或 EPOLLET | EPOLLIN | EPOLLRDHUP (ET)。EPOLLOUT,寫完移除。EPOLLERR/EPOLLHUP 視為本端嚴重錯誤,直接關閉清理。recv/send 必須循環至 EAGAIN/EWOULDBLOCK。epoll 事件機制核心在於區分「對端正常關閉」(EPOLLRDHUP)與「本端錯誤」(EPOLLERR/HUP),**異常斷開無法被動檢測**是網路程式設計的鐵律。正確使用 EPOLLRDHUP、心跳機制、ET 模式非阻塞循環讀寫,構建高效穩健的高併發網路伺服器。