2013-04-25 2 views
3

Я пытаюсь разработать приложение чата в c. Я использую гнезда и select(). Но если я закрою сервер перед клиентом, у клиента появится сообщение «Broken Pipe». Я использовал select(), но я не знал, как его избежать?Как избежать сломанной трубы?

+0

возможно дубликат [Как предотвратить SIGPIPEs (или обрабатывать их должным образом)] (http://stackoverflow.com/questions/108183/how-to-prevent-sigpipes-or-handle-them-правильно) – 2013-04-25 16:51:33

+0

Не просто закрывайте трубку, попрощайтесь красиво. Так что другой конец знает, чтобы закрыть его тоже. –

ответ

0

Зарегистрируйте обработчик сигнала PIPE (и, возможно, проигнорируйте сигнал).

+0

есть ли другой способ? я не хочу поймать сигнальную трубку – heruma

+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); 
Смежные вопросы