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

xia*_*hen 7 c posix tcp polling

我用socket()+ POLLIN poll() + recv()+ 编写了一个小型TCP服务器send(),但我不知道何时使用POLLOUT轮询或选择writefds在可写事件上进行轮询.

谁能举个例子说明POLLOUT的真实用法?

Cel*_*ada 18

通常的模式是使用非阻塞文件描述符,poll()如下所示:

  • 准备好时poll(),
    • 总是设置,POLLIN因为您总是有兴趣阅读套接字的另一端发送给您的内容.
      • 除非您有大量的传入数据积压,并且您有意在另一端发送更多信息之前等待另一端.
    • POLLOUT仅当您有未完成的数据发送到另一端时才设置.
  • 返回时poll(),如果它表明数据可供读取,
    • 阅读它并用它做点什么
  • 返回时poll(),如果它指示套接字是可写的,
    • 尝试发送您的优秀数据.
      • 如果你设法写下所有内容,那么POLLOUT下次你不会设置循环
      • 如果你只是设法发送了一些(或者没有),那么请保留其余部分.您将POLLOUT在下一次循环中设置.
  • 当您要发送新数据时(响应您阅读的数据或响应某些外部事件),您有两种选择:
    • 急切地尝试立即发送一些.您可以成功发送任何,部分或全部内容.与前一种情况一样,保留下次未写入的数据部分,并计划POLLOUT仅在剩余某些数据时设置下一次循环.
    • 只需保留数据并计划POLLOUT下一次循环设置.(这种选择通常更容易编程,因为您只需要处理在循环中的一个位置写入数据,但另一方面它会延迟写入数据直到下一次循环.)

  • +1为详细的流描述,因为从来没有很好的`POLLOUT`示例。 (2认同)