2013-04-25 120 views
3

我嘗試在c中開發一個聊天應用程序。我使用插座和select()。 但是,如果我在客戶端之前關閉服務器,客戶端有一條消息「Broken Pipe」。 我用select(),但我不知道如何避免它?如何避免破損的管道?

+0

可能重複[如何防止SIGPIPEs(或妥善處理)](http://stackoverflow.com/questions/108183 /如何防止 - sigpipes - 或 - 處理它們 - 正確) – 2013-04-25 16:51:33

+0

不要只關閉管道,很好地說再見。所以另一端也知道要關閉它。 – 2013-04-25 17:00:34

回答

0

註冊PIPE信號的處理程序(也可能忽略信號)。

+0

還有另外一種方法嗎?我不想捕捉信號管 – heruma 2013-04-25 16:23:56

+0

@heruma:您可以使用'SIG_IGN'忽略'SIGPIPE'。只需閱讀手冊頁或其他內容。某些API還支持額外的管道選項,以禁用從內核傳遞「SIGPIPE」。請參閱http://stackoverflow.com/questions/108183/how-to-prevent-sigpipes-or-handle-them-properly – 2013-04-25 16:50:33

4

您可以禁用信號:雖然選擇的答案是忽略信號處理寬,有其他選擇

signal(SIGPIPE, SIG_IGN); 

使用與MSG_NOSIGNAL發送功能:

send(con, buff_enviar+enviado, length-enviado, MSG_NOSIGNAL); 

在套接字級禁用SIGPIPE(不適用於所有內核):

int flag = 1; 
setsockopt(con, SOL_SOCKET, SO_NOSIGPIPE, &flag, sizeof(flag)); 

禁用SIGPIPE支持來電線程(您可以在以後恢復):

sigset_t set; 
sigemptyset (&set); 
sigaddset (&set, SIGPIPE); 
pthread_sigmask(SIG_BLOCK, &set, NULL); 
相關問題