为什么轮询实现总是清除revents?

时间:2017-06-29 10:08:51

标签: linux io network-programming epoll

opengroup

  

如果fd的值小于0,则忽略事件,并在从poll()返回时在该条目中将revents设置为0.

  

在每个pollfd结构中,poll()清除revents成员,除了应用程序通过设置上面列出的事件之一请求报告条件之外,poll()设置相应的如果请求的条件为真,则返回位。另外,如果条件为真,poll()会在revents中设置POLLHUP,POLLERR和POLLNVAL标志,即使应用程序没有在事件中设置相应的位。

gnulib的实施始终明确要求:

  for (i = 0; i < nfd; i++)
  {
      pfd[i].revents = (pfd[i].fd < 0
                    ? 0
                    : compute_revents (pfd[i].fd, pfd[i].events,
                                       &rfds, &wfds, &efds));
      rc += pfd[i].revents != 0;
  }

与某些平台的glibc

相同
for (f = fds; f < &fds[nfds]; ++f)
{
      f->revents = 0;
      ...

0 个答案:

没有答案