Как я должен закрыть сокет в обработчике сигналов?
Вопрос
Я пишу очень простой сервер, который зацикливается вечно, пока не будет нажата Ctrl-C.Я бы хотел, чтобы обработчик сигналов для ctrl-c закрывал открытые сокеты и выключал сервер, но я не знаю, какова область действия обработчика сигналов, и мне не нравится идея объявлять сокеты, которые мне нужно закрыть, глобальными.
Кто-нибудь может предложить свои предложения?Есть ли какой-то стандартный способ сделать это?
Решение
Что ж, поскольку у вас есть обработчики сигналов, я собираюсь предположить, что вы используете вариант Unix.Если это так:
- Сокет идентифицируется ядром по номеру файла, который является int.Видишь
socket(2)
. - Этот int действителен для вашего процесса
- Этот int действителен для любых процессов, разветвленных после его создания
- Если не close-on-exec, он действителен для любого процесса, который вы выполняете.
Таким образом, это совершенно справедливо в вашем обработчике сигналов.То, как вы информируете свой обработчик сигналов о том, какой номер использовать, зависит от языка, на котором вы пишете, который вы не указали.Есть два подхода, которые будут работать практически на любом языке
- Если вам не нужно ничего убирать, кроме
close
и выходите, просто позвоните exit.Или установите сигнальное действие по умолчанию, то есть выход.Ядро закроет сокеты. - Установите флаг (который обычно будет каким-то глобальным), чтобы сообщить вашему циклу выбора / опроса о необходимости очистки и выхода.Преимущество в том, что вам не нужно беспокоиться о том, безопасны ли различные части вашей программы для вызова из обработчика сигналов.
Другие советы
Как правило, в обработчике сигналов желательно ничего не делать; кроме как установить флаг.
Затем, когда управление возвращается в ваш основной цикл, вы можете проверить этот флаг, выйти из цикла, закрыть сокеты, запустить деструкторы для ваших объектов и т. д. и выйти чисто.
Обработчики сигналов могут вызываться практически в любое время, в том числе во время вызовов библиотеки C или C ++, что может быть проблемой.