簡體   English   中英

使用Epoll Edge Triggered時re-arming EPOLL的時機問題及相關問題

[英]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 ***/

}

問題:

  1. 使用EPOLLONESHOT時,EPOLL應該什么時候REARMED? 在接收到事件之后還是在處理事件之后?

  2. 初級。 在寫入或讀取時,我們會跟蹤寫入/讀取的數據點,直到返回 EAGAIN 或部分讀取/寫入? 是/否。

  3. 最初未設置 EPOLLOUT。 寫入時,當write返回EAGAIN時,我們將EPOLLOUT添加到要監控的事件中。 是/否?

  4. 當 FD 再次觸發 EPOLLOUT 時,我們從上次收到 EAGAIN 的點開始繼續寫入,直到我們再次獲得 EAGAIN。 然后我們重新武裝。 是/否?

  5. 如果我們部分讀取並且不 REARM,新數據將繼續到達但不會觸發任何事件。 因此,如果我們部分讀取,我們需要對其進行跟蹤,而不僅僅是依賴事件處理程序來進行讀取處理。 對?

我不能全部回答,但我可以試着回答幾個。

  1. 初級。 在寫入或讀取時,我們會跟蹤寫入/讀取的數據點,直到返回 EAGAIN 或部分讀取/寫入? 是/否。
    • 對於讀取/接收:您應該處理以下所有情況
      1. 如果您閱讀/接收 EAGAIN 或 EWOULDBLOCK。 這表明沒有任何東西可以讀取/接收,您應該中斷接收循環。
      2. 您收到 0 個字節。 這表示對方不再連接
      3. 您收到 0 > 字節。 您成功讀取/接收數據,應該再次讀取/接收數據。
    • 您不一定需要跟蹤數據,而只是確保您處理上述 3 種情況。
  2. 最初未設置 EPOLLOUT。 寫入時,當write返回EAGAIN時,我們將EPOLLOUT添加到要監控的事件中。 是/否?

    • 是的...我相信在最初設置 EPOLLOUT 的實例中, send() FD 上的行為應該與您在問題中描述的相同...鑒於您將簡單地寫入 FD 而不管事件通知如何並且只有在您收到 EAGAIN/EWOULDBOCK 錯誤時才停止。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM