2013-07-16 35 views
7

Sau đây là trình tự Tôi nhậnTại sao strace lãm EAGAIN (Resource tạm thời không có)

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) 

Tại sao đọc này là nhận được gọi, tôi cho rằng poll nên thức dậy chỉ khi có dữ liệu để đọc

Trả lời

2

poll thức dậy với revents = POLLOUT, có nghĩa là ổ cắm đã sẵn sàng để viết, chưa sẵn sàng để đọc. Mã này dường như không kiểm tra cờ này và vẫn cố gắng đọc.

Điều này có thể có chủ ý. Mặc dù poll không nói rằng ổ cắm đã sẵn sàng để đọc, nó có thể đã sẵn sàng khi đang viết. Vì vậy, nó gọi sẵn sàng chỉ trong trường hợp một cái gì đó đã xuất hiện. Nếu không, nó sẽ quay trở lại vào poll để đợi lại. Điều này cho phép nó xử lý dữ liệu đến nhanh hơn, vì nó có thể nhận được nó trong một cuộc gọi thay vì hai.

+0

Cảm ơn @Barmar, tôi đang sử dụng thư viện ACE C++, tôi đã hy vọng họ xử lý – Avinash

+0

Điều này có gây ra sự cố không? – Barmar

+0

Tôi đã phàn nàn rằng 'recv' đang tiêu thụ CPU cao, vì vậy tôi đã nhìn vào hướng – Avinash

Các vấn đề liên quan