Как я должен закрыть сокет в обработчике сигналов?

StackOverflow https://stackoverflow.com/questions/449617

  •  19-08-2019
  •  | 
  •  

Вопрос

Я пишу очень простой сервер, который зацикливается вечно, пока не будет нажата Ctrl-C.Я бы хотел, чтобы обработчик сигналов для ctrl-c закрывал открытые сокеты и выключал сервер, но я не знаю, какова область действия обработчика сигналов, и мне не нравится идея объявлять сокеты, которые мне нужно закрыть, глобальными.

Кто-нибудь может предложить свои предложения?Есть ли какой-то стандартный способ сделать это?

Это было полезно?

Решение

Что ж, поскольку у вас есть обработчики сигналов, я собираюсь предположить, что вы используете вариант Unix.Если это так:

  • Сокет идентифицируется ядром по номеру файла, который является int.Видишь socket(2).
  • Этот int действителен для вашего процесса
  • Этот int действителен для любых процессов, разветвленных после его создания
  • Если не close-on-exec, он действителен для любого процесса, который вы выполняете.

Таким образом, это совершенно справедливо в вашем обработчике сигналов.То, как вы информируете свой обработчик сигналов о том, какой номер использовать, зависит от языка, на котором вы пишете, который вы не указали.Есть два подхода, которые будут работать практически на любом языке

  • Если вам не нужно ничего убирать, кроме close и выходите, просто позвоните exit.Или установите сигнальное действие по умолчанию, то есть выход.Ядро закроет сокеты.
  • Установите флаг (который обычно будет каким-то глобальным), чтобы сообщить вашему циклу выбора / опроса о необходимости очистки и выхода.Преимущество в том, что вам не нужно беспокоиться о том, безопасны ли различные части вашей программы для вызова из обработчика сигналов.

Другие советы

Как правило, в обработчике сигналов желательно ничего не делать; кроме как установить флаг.

Затем, когда управление возвращается в ваш основной цикл, вы можете проверить этот флаг, выйти из цикла, закрыть сокеты, запустить деструкторы для ваших объектов и т. д. и выйти чисто.

Обработчики сигналов могут вызываться практически в любое время, в том числе во время вызовов библиотеки C или C ++, что может быть проблемой.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top