何时使用poll C函数的POLLOUT事件?

我写了一个小TCP服务器与socket() + POLLINpoll() + recv() + send(),但我不知道什么时候使用POLLOUT投票或选择writefds轮询上写事件。何时使用poll C函数的POLLOUT事件?

谁能给我一个真实使用POLLOUT的例子吗?

回答:

通常的模式是使用非阻塞文件描述符与poll()是这样的:因为你在读什么其他一直有兴趣

  • 当准备poll()

    • 始终设置POLLIN套接字的末尾已经发送给你。

      • 除非您有大量积压的传入数据,并且您有意使另一端在发送更多消息之前等待。
    • 设置POLLOUT只有当您有未完成的数据发送到另一端。
  • 在从poll()回报,若有则表明数据可用来读取,

    • 阅读并用它做什么
  • 返回时从poll(),若有则表明插座是可写的,

    • 尝试发送您的未完成数据。

      • 如果你设法写这一切,你就不会通过循环
      • POLLOUT下一次设置如果你只设法送它的一些(或没有的话),然后剩下的留到后来。您将在下一次循环中设置POLLOUT
  • 当你有新的数据发送(无论是在响应你读或响应一些外部事件的数据),你有两个选择:

    • 热切地尝试发送一些吧马上。您可以成功发送无,部分或全部。就像前一种情况一样,保留下一次未写入的数据部分,并计划在下一次循环中设置POLLOUT,前提是只有剩余一些数据。
    • 只需保留数据并计划在下次循环时设置POLLOUT。 (这个选择通常更容易编程,因为您只需要在循环中的一个地方处理数据写入,但另一方面,它会延迟写入数据直到下一次循环。)

回答:

从nginx的来源,我发现:

如果有一些数据发送出去,nginx的尝​​试与一个系统调用发送(也许writev可以获得)。但是,如果nginx无法一次发送全部数据,它将在pollfd上设置POLLOUT(如果使用poll事件)以等待可写事件。获取可写事件时,nginx会发送左边的数据。

当nginx试图响应大的静态文件时很容易重现这种情况

以上是 何时使用poll C函数的POLLOUT事件? 的全部内容, 来源链接: utcz.com/qa/261499.html

回到顶部