走讀核心原始碼,看看 epoll 的 lt 和 et 模式區別。
詳細資訊可以參考文章《[epoll 原始碼走讀] epoll 實現原理》,現在將部分**提取出來。核心邏輯在
ep_send_events_proc
函式裡實現,關鍵在就緒列表。
syscall_define4
(epoll_wait,
int, epfd,
struct epoll_event __user *
, events,
int, maxevents,
int, timeout)
static
intdo_epoll_wait
(int epfd,
struct epoll_event __user *events,
int maxevents,
int timeout)
// 檢查就緒佇列,如果就緒佇列有就緒事件,就將事件資訊從核心空間傳送到使用者空間。
static
intep_poll
(struct eventpoll *ep,
struct epoll_event __user *events,
int maxevents,
long timeout)
static
intep_send_events
(struct eventpoll *ep,
struct epoll_event __user *events,
int maxevents)
static __poll_t ep_scan_ready_list
(struct eventpoll *ep,
__poll_t (
*sproc)
(struct eventpoll *
,struct list_head *
,void*)
,void
*priv,
int depth, bool ep_locked)
static __poll_t ep_send_events_proc
(struct eventpoll *ep,
struct list_head *head,
void
*priv)
// 成功處理就緒事件的 fd 個數。
esed->res++
; uevent++;if
(epi->event.events & epolloneshot)
// #define ep_private_bits (epollwakeup | epolloneshot | epollet | epollexclusive)
epi->event.events &
= ep_private_bits;
elseif(
!(epi->event.events & epollet))}
return0;
}
你的點讚?,是對作者最好的支援,謝謝!? epoll的ET模式與LT模式
1 include wrap.h 2 include 3 include 4 define max event num 1024 5 define buff size 1067 void delfd int epollfd int fd 815 void addfd int epollfd int ...
epoll的ET和LT模式
從man手冊中,得到et和lt的具體描述如下 epoll事件有兩種模型 edge triggered et level triggered lt 假如有這樣乙個例子 1.我們已經把乙個用來從管道中讀取資料的檔案控制代碼 rfd 新增到epoll描述符 2.這個時候從管道的另一端被寫入了2kb的資料 ...
epoll的ET和LT模式詳解
從man手冊中,得到et和lt的具體描述如下 epoll事件有兩種模型 edge triggered et level triggered lt 假如有這樣乙個例子 1.我們已經把乙個用來從管道中讀取資料的檔案控制代碼 rfd 新增到epoll描述符 2.這個時候從管道的另一端被寫入了2kb的資料 ...