C++: как закрыть tcp-сокет (сервер) при получении SIGKILL

Как я могу закрыть сокет непосредственно перед смертью? У меня есть служба в Linux, которая создает TCP-сервер. Иногда мне приходится перезапускать его, и я хочу, чтобы сокет действительно был закрыт. На данный момент висит. Я также знаю, что SIGKILL нельзя обработать. Может кто-то указать мне верное направление?


person JosephITA    schedule 24.01.2014    source источник


Ответы (2)


Сокет будет закрыт — ОС сделает это автоматически, см.: Использование SO_REUSEADDR. Что происходит с ранее открытым сокетом?

Вместо того, чтобы пытаться обработать SIGKILL, что не сработает, решите проблему при запуске:

Используйте параметр сокета SO_REUSEADDR, который позволяет сразу же повторно использовать порт.

person Karoly Horvath    schedule 24.01.2014
comment
Большое спасибо. Я добавил: int optval=1; setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof optval); - person JosephITA; 24.01.2014

Вы ничего не можете сделать на SIGKILL. Вы должны попытаться обработать SIGTERM и/или SIGINT, чтобы завершить работу службы и закрыть сокет.

Нет необходимости посылать SIGKILL, если

  1. Приложение игнорирует SIGTERM и SIGINT
  2. Системе действительно нужно немедленно завершить приложение

Когда вы хотите перезапустить свою службу, вы должны отправить SIGTERM или SIGINT вместо SIGKILL.

person Ari    schedule 24.01.2014
comment
Хорошо, я добавляю обработчик SIGINT (SIGTERM уже обрабатывался). Я использую перезапуск с выскочки, чтобы деактивировать и повторно активировать сервер. - person JosephITA; 24.01.2014