[英]Question on the timing of re-arming EPOLL and related questions when using Epoll Edge Triggered
在使用邊緣觸發和 EPOLLONESHOT 時,我對 EPOLL 有一些疑問。
下面列出了簡化的語句序列。 實際上多個文件由一個 Epoll Fd 監控,一個集合通過一個特定的線程進行管理。 所使用的變量名稱不言自明,當然是設置的。 為簡潔起見,省略了該部分:
1. Create epollFd
epollFd = epoll_create1(EPOLL_CLOEXEC);
2. Create events to monitor
epollEventParam.events = EPOLLIN | EPOLLPRI | EPOLLERR | EPOLLHUP | EPOLLET | EPOLLONESHOT;
3. Add the FD to monitor and the events
epoll_ctl(epollFd, EPOLL_CTL_ADD, socketFd, &epollEventParam);
4. While loop with epoll_wait
while (1) {
noFdsEvented = epoll_wait(epollFd, epollEventsReported, maxEvents, -1);
/***************** REARM Here or after processing the events? ******/
epoll_ctl(epollFd, EPOLL_CTL_MOD, (int)epollEventsReported[i].data.fd, &epollEventParam);
/** if EPOLLIN, read until read returns EAGIN ***/
//Relevant code to read...
//After EAGAIN is returned, REARM Here instead of doing so earlier (above)?
/** if EPOLLOUT, write until write returns EAGIN ***/
//Relevant code to write...
//After EAGAIN is returned, REARM Here instead of doing so earlier (above)?
/*** If other events... process accordingly ***/
}
問題:
使用EPOLLONESHOT時,EPOLL應該什么時候REARMED? 在接收到事件之后還是在處理事件之后?
初級。 在寫入或讀取時,我們會跟蹤寫入/讀取的數據點,直到返回 EAGAIN 或部分讀取/寫入? 是/否。
最初未設置 EPOLLOUT。 寫入時,當write返回EAGAIN時,我們將EPOLLOUT添加到要監控的事件中。 是/否?
當 FD 再次觸發 EPOLLOUT 時,我們從上次收到 EAGAIN 的點開始繼續寫入,直到我們再次獲得 EAGAIN。 然后我們重新武裝。 是/否?
如果我們部分讀取並且不 REARM,新數據將繼續到達但不會觸發任何事件。 因此,如果我們部分讀取,我們需要對其進行跟蹤,而不僅僅是依賴事件處理程序來進行讀取處理。 對?
我不能全部回答,但我可以試着回答幾個。
最初未設置 EPOLLOUT。 寫入時,當write返回EAGAIN時,我們將EPOLLOUT添加到要監控的事件中。 是/否?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.