我有一个用c ++编写的linux应用程序。 应用程序侦听某个端口上的套接字。我使用ACE Acceptor实现了这个。 此外,应用程序使用init脚本/etc/init.d/postgresql start启动postgresql数据库,方法是调用ACE_OS :: system函数。
我遇到的问题是:当应用程序退出时,端口仍然被占用。当我运行netstat时,我看到postgres正在侦听该端口。 (只有当我从任何给定端口上的应用程序启动postgres时才会发生这种情况。)
有没有办法关闭港口?为什么postgres会听那个端口?
答案 0 :(得分:3)
有没有办法关闭港口?
是。关闭套接字,或在底层文件描述符上设置FD_CLOEXEC。
或者......用一些关闭fds高于stderr的东西包裹您对子进程(...postgresql start
)的调用:
ACE_OS::system("perl -MPOSIX -e 'POSIX::close($_) for 3 .. sysconf(_SC_OPEN_MAX); exec @ARGV' /etc/init.d/postgresql start");
或类似的。把它放在一个脚本中,使它看起来更好。
为什么postgres会听那个端口?
您的子进程(及其子进程)正在继承您的打开文件描述符,包括您的c ++应用程序打开的套接字。