recvmsg retorna 'EAGAIN (recurso temporariamente indisponível)'

11

Após uma mudança recente do servidor, estamos solucionando esse problema estranho de um dos servidores perder a conectividade n / w sem motivo aparente e recuperar a conectividade em alguns segundos ou minutos. Não há vestígios dele /var/log/messages dmesgou mcelogs. Enquanto tentava depurar isso, eu emiti strace ping google.come ele diz = -1 EAGAIN (Resource temporarily unavailable).

Alguém poderia esclarecer o que essa mensagem poderia significar? pingresolve google.com, mas não mostra nenhuma resposta como se as respostas de ping estivessem definidas para serem rejeitadas no firewall.

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: Esta é uma VM VMware e executa o RHEL 6.5

Citylight
fonte

Respostas:

13

Ao ler de um soquete (ou canal ou outra fonte assíncrona), você pode escolher o que acontece se não houver dados disponíveis imediatamente. Você pode esperar a leitura até que alguns dados cheguem (modo de bloqueio) ou retornar imediatamente com um erro (modo de não bloqueio).

O erro retornado no segundo caso é EAGAIN.

Portanto, o EAGAINerro não está realmente lhe dizendo nada aqui. Significa apenas que não havia nada para recvmsg()receber naquele momento.

Jander
fonte
0

Eu estava recebendo esse erro ao tentar ler stdinenquanto não havia stdin, por exemplo, isTTYera falso.

localhostdotdev
fonte