2011-05-02 24 views
3

到目前爲止,我的網絡代碼工作正常,但我有點擔心我的東西在地毯下藏:python套接字與EINTR做什麼?

的手冊頁acceptcloseconnectrecvsend提到,errno.EINTR最多可顯示當系統調用被信號中斷。

我在這裏很無能。

python是做什麼的?它是否會自動重試呼叫,它是否會通過該errno引發socket.error?如果引發異常,我應該怎麼做?我可以在我的單位測試中自己生成這些信號嗎?

+0

哦,不知道它是否重要,但我的套接字是非阻塞的。它設置在套接字本身上,而不是作爲recv或send的參數。 – Niriel 2011-05-02 14:40:25

回答

1

Python只是重試呼叫並隱藏來自用戶的信號(幫助跨平臺一致性,其中-EINTR不存在)。您可以放心地忽略EINTR問題,但如果您想要進行測試,則很容易。只需設置一個不會返回的阻塞操作(例如沒有傳入連接的socket.accept)並向該進程發送一個信號。

+0

雖然對於所有系統調用都不成立。根據這個(仍然是公開的)錯誤,Python *應該重新嘗試調用,但是至少在一些相關的情況下:http://bugs.python.org/issue9867 - 但是那裏的評論說「SocketIO,子進程,多處理,socket.sendall「*做*重試。 – 2012-03-22 12:20:58