1

我有一个用 c++ 编写的 linux 应用程序。应用程序侦听某个端口上的套接字。我使用 ACE Acceptor 实现了这一点。此外,应用程序使用初始化脚本 /etc/init.d/postgresql start 通过调用 ACE_OS::system 函数来启动 postgresql 数据库。

我遇到的问题是:当应用程序退出时,端口仍然被占用。当我运行 netstat 时,我看到 postgres 正在侦听该端口。(只有当我从任何给定端口上的应用程序启动 postgres 时才会发生这种情况)。

有没有办法关闭端口?为什么 postgres 监听那个端口?

4

1 回答 1

3

有没有办法关闭端口?

是的。关闭套接字,或在底层文件描述符上设置 FD_CLOEXEC。

...postgresql start或者......用可以关闭高于标准错误的 fds 的东西来包装您对子进程 ( ) 的调用:

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

或类似的。把它塞进一个脚本里,让它看起来更好看。

为什么 postgres 监听那个端口?

您的子进程(及其子进程)正在继承您的打开文件描述符,包括您的 c++ 应用程序打开的套接字。

于 2011-10-25T21:04:32.373 回答