как перестать слушать порт - PullRequest
       27

как перестать слушать порт

1 голос
/ 26 октября 2011

У меня есть приложение Linux, написанное на C ++.Приложение слушает сокет на определенном порту.Я реализовал это с помощью ACE Acceptor.Кроме того, приложение запускает базу данных postgresql, используя сценарий инициализации /etc/init.d/postgresql, вызывая функцию ACE_OS :: system.

Проблема, с которой я сталкиваюсь, заключается в следующем: при выходе из приложения портвсе еще занят.Когда я запускаю netstat, я вижу, что postgres прослушивает этот порт.(Это происходит только в том случае, если я запускаю postgres из приложения на каком-либо порту).

Есть ли способ закрыть порт?Почему postgres прослушивает этот порт?

1 Ответ

3 голосов
/ 26 октября 2011

Есть ли способ закрыть порт?

Да. Закройте сокет или установите FD_CLOEXEC для базового файлового дескриптора.

Или ... оберните ваш вызов дочернему процессу (...postgresql start) чем-то, что закроет fds выше, чем stderr:

ACE_OS::system("perl -MPOSIX -e 'POSIX::close($_) for 3 .. sysconf(_SC_OPEN_MAX); exec @ARGV' /etc/init.d/postgresql start");

или аналогичный. Заправьте это в сценарий, чтобы он выглядел лучше.

Почему postgres прослушивает этот порт?

Ваши дочерние процессы (и их дочерние элементы) наследуют ваши дескрипторы открытых файлов, включая сокет, который открывает ваше приложение на c ++.

...