Как мне закрыть сокет в обработчике сигнала? - PullRequest
8 голосов
/ 16 января 2009

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

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

Ответы [ 2 ]

9 голосов
/ 16 января 2009

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

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

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

7 голосов
/ 16 января 2009

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

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

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

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