Позвольте мне резюмировать, в чем, по моему мнению, ваша проблема: когда вы нажимаете ctrl + c , чтобы закрыть клиент, сервер завершается. И вы хотите, чтобы это поведение обрабатывалось таким образом, чтобы сервер не зависал, как описано выше. Если это правда, пожалуйста, продолжайте читать, я думаю, что смогу пролить некоторый свет на реальную проблему, это не имеет большого отношения к использованию (или не использованию) правильного дескриптора сигнала.
Когда вы закрываете клиент с помощью ctrl + c , ОС остановит клиентский процесс и закроет все открытые им сокеты. В рамках этого FIN будет отправлено на сервер.
Пожалуйста, проверьте ваш код. Я полагаю, что вы написали бы код таким образом, чтобы он блокировался в вызове read () из сокета с соответствующим клиентом. Теперь, когда FIN, отправленный выше, достигает сокета на стороне сервера, это чтение вернется со значением 0.
Если ваш код не проверяет это условие и пытается что-то записать обратно клиенту, в конечном счете (я пропускаю несколько шагов, которые выполняются в промежуточном режиме), он получит SIGPIPE. Это приведет к сбою вашего сервера.
Если приведенный выше сценарий верен, у вас есть 2 выхода:
1. проверьте read (), вернув 0, и продолжайте.
2. установить обработчик сигнала для SIGPIPE.
Я предпочитаю 1-й метод, кстати.