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

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

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


person Zxaos    schedule 16.01.2009    source источник


Ответы (2)


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

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

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

  • Если вам не нужно ничего очищать, кроме close и выхода, просто вызовите exit. Или установите действие сигнала по умолчанию, то есть выход. Ядро закроет сокеты.
  • Установите флаг (который обычно будет в некотором роде глобальным), чтобы сообщить циклу select / poll об очистке и выходе. Преимущество в том, что вам не нужно беспокоиться о том, безопасно ли вызывать различные части вашей программы из обработчика сигналов.
person derobert    schedule 16.01.2009
comment
Разве операционная система не отвечает за очистку после вызова закрытия? - person Bionix1441; 02.12.2016
comment
@ Bionix1441 Думаю, это вопрос по поводу очистки и выхода из второго пункта? Я имею в виду, что ваша программа может иметь другую очистку (например, сохранять измененные данные, удалять файлы блокировки, ...). Это намного проще сделать вне обработчика сигналов. - person derobert; 02.12.2016

Обычно рекомендуется не делать ничего особенного в обработчике сигналов; кроме установки флага.

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

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

person MarkR    schedule 16.01.2009