如何停止监听端口
我有一个用 C++ 编写的 Linux 应用程序。 应用程序侦听某个端口上的套接字。我使用 ACE Acceptor 实现了这一点。 此外,应用程序使用初始化脚本 /etc/init.d/postgresql start 通过调用 ACE_OS::system 函数来启动 postgresql 数据库。
我遇到的问题是:当应用程序退出时,端口仍然被占用。当我运行 netstat 时,我看到 postgres 正在监听该端口。 (只有当我从任何给定端口上的应用程序启动 postgres 时才会发生这种情况)。
有没有办法关闭端口?为什么 postgres 监听该端口?
I have a linux application written in c++.
The application listens to a socket on a certain port. I implemented this using ACE Acceptor.
In addition the application starts postgresql database using the init script /etc/init.d/postgresql start by calling the ACE_OS::system function.
The problem I am having is: When the application exits, the port is still occupied. When I run netstat I see that the postgres is listening to that port. (This only happens if I start postgres from the application on any given port).
Is there a way to close the port? Why does postgres listen to that port?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
是的。关闭套接字,或在底层文件描述符上设置 FD_CLOEXEC。
或者...将您的调用包装到子进程(
...postgresql start
)中,并使用将关闭高于 stderr:或类似文件的 fds 的内容。将其放入脚本中以使其看起来更好。
您的子进程(及其子进程)将继承您打开的文件描述符,包括您的 c++ 应用程序打开的套接字。
Yes. Close the socket, or set FD_CLOEXEC on the underlying file descriptor.
Or ... wrap your call to the child process (
...postgresql start
) with something that will close fds higher than stderr:or similar. Tuck that in a script to make it look nicer.
Your child processes (and their children) are inheriting your open file descriptors, including the socket your c++ app opens.