2013-07-16 44 views
7

以下是我得到爲什麼strace的顯示EAGAIN(資源暫時不可用)

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應該警醒,只有當有數據讀取

回答

2

pollrevents = POLLOUT一起醒來,這表示套接字已準備好寫入,尚未準備好讀取。該代碼顯然不檢查這個標誌,並試圖閱讀。

這可能是故意的。儘管poll沒有說套接字已準備好讀取,但它在寫入時可能已準備就緒。所以它會調用ready以防萬一出現。如果不是,它將回到poll再次等待。這使得它可以更快地處理傳入數據,因爲它可以在一次調用中而不是兩次中處理。

+0

Thanks @Barmar,我正在使用ACE C++庫,我希望他們能處理這個問題 – Avinash

+0

是否會導致問題? – Barmar

+0

我抱怨'recv'消耗高CPU,所以我正在研究方向 – Avinash

相關問題