我遇到这样一种情况,我有一个正在写入的 TCP 套接字(非阻塞),但在负载下它会进入不断返回 EAGAIN 的情况。我知道这是因为它停止了处理,我可以附加一个调试器并单步执行它。单步执行,写入调用返回一个错误,errno 每次都设置为 EAGAIN(它忙于等待 EAGAIN...忽略这是个坏主意:)
我的理解是,如果缓冲区已满,EAGAIN 应该只在写入时返回,但我不明白什么会阻止它耗尽和写入调用最终成功。
这是 Ubuntu,Linux 内核 3.19.0-47-generic。
想法?
最佳答案
阻止它耗尽的原因是同行的阅读速度不如您的写作速度。对等方的接收缓冲区已满,您的发送缓冲区已满,您无法写入。
it busy-waits on EAGAIN...ignore that this is a bad idea
我不能忽视这一点。这是个坏主意。您应该在这种特定情况下使用 select()
来告诉您套接字何时可写,而不是无意识地循环。
关于linux - 写入 TCP 套接字不断返回 EAGAIN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36539580/