2016-05-06 32 views
0

我創建了epoll並註冊了一些嘗試連接到本地主機上關閉端口的非阻塞套接字。爲什麼epoll告訴我,我可以寫入這個套接字(它提供事件掩碼中包含EPOLLOUT的事件之一)?但是這個套接字不打開,如果我嘗試發送一些東西給我,我得到一個錯誤Connection refused用於連接套接字的Epoll事件

另一個問題 - 什麼意思,即使EPOLLHUP?我認爲這是拒絕連接的事件。但是如何在這種情況下事件可以同時具有EPOLLHUP和EPOLLOUT事件?

Python的示例代碼:

import socket 
import select 

poll = select.epoll() 
fd_to_sock = {} 
for i in range(1, 3): 
    s = socket.socket() 
    s.setblocking(0) 
    s.connect_ex(('localhost', i)) 
    poll.register(s, select.EPOLLOUT) 
    fd_to_sock[s.fileno()] = s 

print(poll.poll(0.1)) 
# prints '[(4, 28), (5, 28)]' 

回答

1

所有這一切poll保證爲您的應用程序不會調用相應功能後阻塞。所以你得到了你已經支付的 - 你現在可以放心寫入這個套接字不會阻止 - 它並沒有阻止,是嗎?

民意調查從不保證相應的操作將會成功

+0

哦,當然=)謝謝你,我對「民意調查」的工作原理有一個誤解。 –

1

poll/select/epoll當文件描述符「準備就緒」時返回,但這只是表示操作不會阻止(並非您必須能夠成功寫入)。

同樣對於EPOLLIN:例如,當套接字關閉時它將返回就緒;在這種情況下,您實際上無法從中讀取數據。

EPOLLHUP表示連接上出現「掛斷」。這實際上只有在你實際連接後纔會發生。同時,文檔(http://linux.die.net/man/2/epoll_ctl)說,你不需要反正它包含:

EPOLLHUP 掛斷發生在相關的文件描述符。 epoll_wait(2)將一直等待這個事件;沒有必要將其設置爲事件。