recvmsg 返回“EAGAIN(资源暂时不可用)”

recvmsg 返回“EAGAIN(资源暂时不可用)”

最近一次服务器移动后,我们正在解决这个奇怪的问题,其中一台服务器无缘无故失去网络连接,并在几秒钟或几分钟内恢复连接。/var/log/messages dmesg或中没有它的踪迹mcelogs。在尝试调试这个问题时,我发出了

strace ping google.com

它返回

= -1 EAGAIN (Resource temporarily unavailable)

有人能解释一下这条消息的含义吗?ping解析 google.com,但它不会显示任何响应,就好像 ping 回复在防火墙中设置为拒绝一样。

sendmsg(3, {msg_name(16)={sa_family=AF_INET, sin_port=htons(0), sin_addr=inet_addr("74.125.131.113")}, msg_iov(1)=[{"\10\0005\321?i\0\3v\301lT\0\0\0\0\335\331\3\0\0\0\0\0\20\21\22\23\24\25\26\27"..., 64}], msg_controllen=0, msg_flags=0}, 0) = 64
recvmsg(3, 0x7fffd48b9cc0, 0)           = -1 EAGAIN (Resource temporarily unavailable)

PS:这是一个 VMware VM,运行 RHEL 6.5

答案1

当您从套接字(或管道或其他异步源)读取数据时,您可以选择如果没有立即可用的数据,会发生什么情况。您可以让读取等待直到某些数据到达(阻塞模式),也可以让它立即返回并出现错误(非阻塞模式)。

在第二种情况下返回的错误是EAGAIN

所以这个EAGAIN错误并没有真正告诉你任何事情。这只是意味着recvmsg()当时没有任何东西可以接收。

相关内容