为什么STRACE显示EAGAIN(资源暂时不可用)

时间:2022-09-22 12:30:26

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

为什么会被调用,我假设只有当有数据可以读取时,投票才会被唤醒?

1 个解决方案

#1


2  

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.

这可能是故意的。尽管民意调查并没有说这个插座已经准备好了,但它可能已经准备好了。所以它需要准备好以防出现什么情况。如果不是,它将重新回到轮询中等待。这使它能够更快地处理传入的数据,因为它可以在一个调用中获得它,而不是两个调用。

#1


2  

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.

这可能是故意的。尽管民意调查并没有说这个插座已经准备好了,但它可能已经准备好了。所以它需要准备好以防出现什么情况。如果不是,它将重新回到轮询中等待。这使它能够更快地处理传入的数据,因为它可以在一个调用中获得它,而不是两个调用。