何时使用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