Why STRACE shows EAGAIN (resource is temporarily unavailable)

The following is the sequence I get

socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 7 setsockopt(7, SOL_TCP, TCP_NODELAY, [1], 4) = 0 setsockopt(7, SOL_SOCKET, SO_SNDBUF, [32120], 4) = 0 getsockopt(7, SOL_SOCKET, SO_SNDBUF, [30064835312], [4]) = 0 setsockopt(7, SOL_SOCKET, SO_SNDBUF, [64240], 4) = 0 getsockopt(7, SOL_SOCKET, SO_SNDBUF, [30064899552], [4]) = 0 stat("/etc/localtime", {st_dev=makedev(8, 1), st_ino=229001, st_mode=S_IFREG|0644, st_nlink=1, st_uid=0, st_gid=0, st_blksize=4096, st_blocks=8, st_size=265, st_atime=2013/07/15-06:30:03, st_mtime=2012/06/25-23:46:43, st_ctime=2012/06/25-23:46:43}) = 0 write(1, "[info 2013/07/16 05:53:24.622210"..., 114) = 114 setsockopt(7, SOL_SOCKET, SO_RCVBUF, [32120], 4) = 0 getsockopt(7, SOL_SOCKET, SO_RCVBUF, [30064835312], [4]) = 0 setsockopt(7, SOL_SOCKET, SO_RCVBUF, [64240], 4) = 0 getsockopt(7, SOL_SOCKET, SO_RCVBUF, [30064899552], [4]) = 0 fcntl(7, F_GETFL) = 0x2 (flags O_RDWR) fcntl(7, F_SETFL, O_RDWR|O_NONBLOCK) = 0 rt_sigaction(SIGPIPE, {SIG_IGN, [PIPE], SA_RESTORER|SA_RESTART, 0x33b3632920}, {SIG_DFL, [], 0}, 8) = 0 fcntl(7, F_GETFL) = 0x802 (flags O_RDWR|O_NONBLOCK) fcntl(7, F_SETFL, O_RDWR|O_NONBLOCK) = 0 connect(7, {sa_family=AF_INET, sin_port=htons(50505), sin_addr=inet_addr("1.2.3.4")}, 16) = -1 EINPROGRESS (Operation now in progress) poll([{fd=7, events=POLLIN|POLLOUT}], 1, 59000) = 1 ([{fd=7, revents=POLLOUT}]) fcntl(7, F_GETFL) = 0x802 (flags O_RDWR|O_NONBLOCK) fcntl(7, F_SETFL, O_RDWR) = 0 getsockname(7, {sa_family=AF_INET, sin_port=htons(33220), sin_addr=inet_addr("10.112.204.215")}, [16]) = 0 fcntl(7, F_GETFL) = 0x2 (flags O_RDWR) fcntl(7, F_GETFL) = 0x2 (flags O_RDWR) fcntl(7, F_SETFL, O_RDWR|O_NONBLOCK) = 0 write(7, "d\23;\177\377\330\357\1&W\1\\\4\np\314\327\0\0\0\2W\0\rpnq-gst-"..., 103) = 103 fcntl(7, F_GETFL) = 0x802 (flags O_RDWR|O_NONBLOCK) fcntl(7, F_SETFL, O_RDWR) = 0 fcntl(7, F_GETFL) = 0x2 (flags O_RDWR) fcntl(7, F_GETFL) = 0x2 (flags O_RDWR) fcntl(7, F_SETFL, O_RDWR|O_NONBLOCK) = 0 read(7, 0x9d9f90, 1) = -1 EAGAIN (Resource temporarily unavailable) 

Why is this reading invoked, I assume that poll should wake up only when there is data to read

+7
linux tcp strace
source share
1 answer

poll woke up with revents = POLLOUT , which means the socket is ready to write, not ready to read. The code does not seem to check this flag and tries to read it anyway.

This may be intentional. Although the poll did not say that the socket is ready to read, it might be ready at the time of writing. Therefore, he calls preparedness in case something appears. If not, he will return to poll to wait again. This allows you to process incoming data faster, since it can receive it with one call, not two.

+2
source share

All Articles