2012-05-06 66 views

回答

2

取決於你如何做你正在做什麼,你可以處理SIG_PIPE,當連接任意打破它可以發生。

你不應該處理任何其他信號。

如果您正在使用select()poll()或(個人喜好)epoll()你應該檢查錯誤(例如,POLLHUP)您檢查讀/寫可用性之前

您還應該經常檢查返回值read()/write()/send()/recv()。如果有錯誤,則返回-1,但如果它們返回0,則意味着另一端斷開連接。也就是說,讀取0只意味着讀取了0個字節,但連接仍然良好。事實並非如此。關閉插座。這由POSIX規定。

+0

我問過這個問題,因爲在我的代碼的第一個版本中,當服務器發生分段錯誤時,客戶端進入無窮大循環...... 所以在這種情況下,客戶端也收到一個SIG_PIPE? – giozh

+0

@SvenMarnach我已經在雙方使用超時(只使用alarm()函數),但我想知道是否有其他類型的信號來處理:) – giozh

+0

@SvenMarnach:如果你不得不求助於超時或線程你做錯了什麼。 – delicateLatticeworkFever