gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 00:14:43 29 4
gpt4 key购买 nike

下面是我得到的顺序

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)

为什么要调用这个读取,我假设 poll 应该只在有数据要读取时唤醒

最佳答案

pollrevents = POLLOUT 唤醒,这意味着套接字已准备好写入,尚未准备好读取。代码显然没有检查这个标志,而是试图读取。

这可能是故意的。尽管 poll 没有说套接字已准备好读取,但它可能在写入时就已准备就绪。所以它会调用 ready 以防出现某些情况。如果没有,它将返回 poll 再次等待。这允许它更快地处理传入的数据,因为它可以在一次调用而不是两次调用中获取数据。

关于linux - 为什么STRACE显示EAGAIN(资源暂时不可用),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17666145/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com