Как я могу закрыть сокет непосредственно перед смертью? У меня есть служба в Linux, которая создает TCP-сервер. Иногда мне приходится перезапускать его, и я хочу, чтобы сокет действительно был закрыт. На данный момент висит. Я также знаю, что SIGKILL нельзя обработать. Может кто-то указать мне верное направление?
C++: как закрыть tcp-сокет (сервер) при получении SIGKILL
Ответы (2)
Сокет будет закрыт — ОС сделает это автоматически, см.: Использование SO_REUSEADDR. Что происходит с ранее открытым сокетом?
Вместо того, чтобы пытаться обработать SIGKILL, что не сработает, решите проблему при запуске:
Используйте параметр сокета SO_REUSEADDR
, который позволяет сразу же повторно использовать порт.
person
Karoly Horvath
schedule
24.01.2014
Большое спасибо. Я добавил:
int optval=1; setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof optval);
- person JosephITA; 24.01.2014
Вы ничего не можете сделать на SIGKILL. Вы должны попытаться обработать SIGTERM и/или SIGINT, чтобы завершить работу службы и закрыть сокет.
Нет необходимости посылать SIGKILL, если
- Приложение игнорирует SIGTERM и SIGINT
- Системе действительно нужно немедленно завершить приложение
Когда вы хотите перезапустить свою службу, вы должны отправить SIGTERM или SIGINT вместо SIGKILL.
person
Ari
schedule
24.01.2014
Хорошо, я добавляю обработчик SIGINT (SIGTERM уже обрабатывался). Я использую перезапуск с выскочки, чтобы деактивировать и повторно активировать сервер.
- person JosephITA; 24.01.2014