Why STRACE shows EAGAIN (Resource temporarily unavailable)
linux, strace, tcp
Solution
`poll` woke up with `revents = POLLOUT`, which means that the socket is ready to write, not ready to read. The code is apparently not checking this flag, and trying to read anyway.
This might be intentional. Even though `poll` didn't say the socket is ready to read, it might have become ready while it was writing. So it calls ready just in case something has shown up. If not, it will go back into `poll` to wait again. This allows it to process incoming data more quickly, since it can get it in one call rather than two.
Problem
Following is the sequence I am getting ``` 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 this read is getting called, I assume that `poll` should wake up only when there is data to read