我看到一个情况,我有一个TCP套接字(非阻塞),正在向其中写入数据,但在负载高的情况下,它会持续返回EAGAIN。我知道这是因为它停止了处理,我可以附加调试器并逐步执行它。通过逐步执行,每次写入调用都返回错误,并且errno被设置为EAGAIN(它在EAGAIN上忙等待...请忽略这是一个坏主意 :))。
我的理解是,只有在缓冲区已满时,才应该在写入时返回EAGAIN,但我不明白是什么导致它无法排空缓冲区,最终使写入调用成功。
这是Ubuntu,Linux内核3.19.0-47-generic。
有什么想法吗?
我的理解是,只有在缓冲区已满时,才应该在写入时返回EAGAIN,但我不明白是什么导致它无法排空缓冲区,最终使写入调用成功。
这是Ubuntu,Linux内核3.19.0-47-generic。
有什么想法吗?
send()
调用。如果你永远无法写入任何内容,那么要么你的读取器已停止,要么就是没有任何东西:没有其他可能导致它的 '其他原因' 最终都会超时连接。 - user207421