2013-03-16 69 views
0

我正在閱讀W. Richard Stevens的Unix Network Programming。 作者說,如果阻塞連接呼叫中斷,我可以使用'選擇'作爲非阻塞連接的選擇。阻止'connect'系統調用中斷

我很困惑。如果我應該調用一個非阻塞連接,然後選擇新的socktfd,或者應該選擇傳遞給前一個阻塞連接調用的舊socketfd?

而且我在帖子中看到,如果信號動作與SA_RESTART標誌一起傳遞,則說'連接'是可重新啓動的。如果這樣我完全可以忽略阻塞連接中斷的情況?

+0

在提示符處輸入'man 7 signal'。搜索EINTR。它解釋了一切。如果您的流程中沒有任何可能觸發信號的代碼,那麼您可能不必擔心這一點。或者你可以把EINTR看作是一個瞬態錯誤(類似於EAGAIN,EWOULDBLOCK),並且可以正常恢復。 – selbie 2013-03-16 05:28:10

+0

什麼是新sockfd?每個插座只有一個。調用connect()不會創建新的Le。 – EJP 2013-03-16 06:46:24

回答

0

如果您正在使用阻塞呼叫,您將必須檢查錯誤代碼並根據錯誤代碼重試,如果發生中斷,該錯誤代碼將爲EINTR。否則使用選擇哪個不會因爲中斷而返回。在超時,錯誤或讀寫信號的情況下,僅選擇返回。

+0

你是不是指EINTR? – selbie 2013-03-16 05:28:56

+0

對不起我的錯誤。修復。 – 2013-03-16 06:04:37

+0

我試圖弄清楚的是這個。如果應用程序不在其自己的代碼中調用信號,EINTR是否可以實際發生?或者是否有一些常見的庫會產生這些會干擾套接字代碼的信號中斷? – selbie 2013-03-16 06:07:48