【问题标题】:Question on the timing of re-arming EPOLL and related questions when using Epoll Edge Triggered关于使用Epoll Edge Triggered时重新布防EPOLL的时机问题及相关问题
【发布时间】:2020-06-06 16:01:27
【问题描述】:

在使用边缘触发和 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 应该在什么时候重新设置?收到事件后还是处理完事件后?

  2. 初级。在写入或读取时,我们会跟踪写入/读取的数据点,直到返回 EAGAIN 或部分读取/写入?是/否。

  3. 最初没有设置 EPOLLOUT。写入时,当write返回EAGAIN时,我们将EPOLLOUT添加到事件中 被监控。是/否?

  4. 当再次为 FD 触发 EPOLLOUT 时,我们会从上次收到 EAGAIN 的点继续写入 并这样做,直到我们再次获得 EAGAIN。然后我们重新武装。是/否?

  5. 如果我们读取部分内容并且不重新武装,新数据将继续到达,但不会触发任何事件。 因此,如果我们部分读取,我们需要对其进行跟踪,而不是仅仅依靠事件处理程序来进行读取处理。对吧?

【问题讨论】:

    标签: epoll epollet


    【解决方案1】:

    我不能全部回答,但我可以尝试回答几个。

    1. 初级。在写入或读取时,我们会跟踪写入/读取的数据点,直到返回 EAGAIN 或部分读取/写入?是/否。
      • 对于读取/接收:您应该处理以下所有情况
        1. 如果您读取/接收 EAGAIN 或 EWOULDBLOCK。这表明没有任何内容可以读取/接收,您应该中断接收循环。
        2. 您收到 0 个字节。这表示对方不再连接
        3. 您收到 0 > 个字节。您已成功读取/接收数据,应该再次读取/接收数据。
      • 您不一定需要跟踪数据,而只是确保处理上述 3 种情况。
    2. 最初没有设置 EPOLLOUT。写入时,当write返回EAGAIN时,我们将EPOLLOUT添加到要监控的事件中。是/否?

      • 是的...我相信在最初设置 EPOLLOUT 的情况下,send() FD 上应该会发生与您在问题中描述的相同的行为...假设您将简单地写入 FD 而不管事件通知,并且仅在您收到 EAGAIN/EWOULDBOCK 错误时停止。

    【讨论】:

    • 谢谢。我已经超越了这一点,但有助于知道我的实现是正确的。
    • 我知道这是一个完全不相关的问题,但您可能会感兴趣。这涉及 SDP 解析。在 Peon 中,您是否处理 SDP 中的错误?恢复等?我在 Bison/Flex 中编写了一个 SDP 解析器(几乎完成),虽然有足够的错误恢复代码,但我想知道如果 SDP(offer、answer、prOffer 等等......)是否有继续处理的意义任何错误。另外,除了语法错误之外,在 SDP 解析过程中还做了多少语义检查以使错误不会传播?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-03
    • 1970-01-01
    • 1970-01-01
    • 2019-05-29
    相关资源
    最近更新 更多