recvmsg возвращает 'EAGAIN (ресурс временно недоступен)'

11

После недавнего перемещения сервера мы устраняем эту причудливую проблему, связанную с тем, что один из серверов теряет связь n / w без видимой причины и восстанавливает связь через несколько секунд или минут. Там нет никаких следов этого /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

Citylight
источник

Ответы:

13

Когда вы читаете из сокета (или канала или другого асинхронного источника), вы можете выбрать, что произойдет, если данные не будут сразу доступны. Либо вы можете заставить чтение ждать до тех пор, пока некоторые данные не поступят (режим блокировки), либо вы можете немедленно вернуть их с ошибкой (неблокирующий режим).

Ошибка возвращается во втором случае EAGAIN.

Так что EAGAINошибка на самом деле ничего не говорит вам здесь. Это просто означает, что тогда нечего recvmsg()было получать.

Jander
источник
0

Я получал эту ошибку, пытаясь прочитать, stdinпока не было stdin, например, isTTYбыл ложным.

localhostdotdev
источник