recvmsg mengembalikan 'EAGAIN (Sumberdaya sementara tidak tersedia)'

11

Setelah perpindahan server baru-baru ini, kami memecahkan masalah aneh ini dari salah satu server yang kehilangan konektivitas n / w tanpa alasan yang jelas dan mendapatkan kembali konektivitas dalam beberapa detik atau menit. Tidak ada jejak /var/log/messages dmesgatau mcelog. Sementara mencari mencoba men-debug ini, saya mengeluarkan strace ping google.comdan katanya = -1 EAGAIN (Resource temporarily unavailable).

Bisakah seseorang menjelaskan arti pesan ini? pingmenyelesaikan google.com, tetapi tidak akan menunjukkan respons apa pun seolah-olah balasan ping ditetapkan untuk ditolak di 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: Ini adalah VM VMware dan menjalankan RHEL 6.5

Cahaya kota
sumber

Jawaban:

13

Ketika Anda membaca dari soket (atau pipa atau sumber asinkron lainnya), Anda dapat memilih apa yang terjadi jika tidak ada data yang segera tersedia. Entah Anda dapat menunggu menunggu hingga beberapa data tiba (mode pemblokiran), atau Anda dapat segera mengembalikannya dengan kesalahan (mode nonblocking).

Kesalahan itu kembali dalam kasus kedua adalah EAGAIN.

Jadi EAGAINkesalahannya tidak benar-benar memberi tahu Anda apa pun di sini. Itu hanya berarti bahwa tidak ada yang recvmsg()bisa diterima saat itu.

Jander
sumber
0

Saya mendapatkan kesalahan ini dengan mencoba membaca dari stdinsaat tidak ada stdin, misalnya isTTYsalah.

localhostdotdev
sumber