【问题标题】:how to stop listening to a port如何停止监听端口
【发布时间】:2011-12-15 07:10:34
【问题描述】:

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

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

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

【问题讨论】:

  • 你的问题实际上不是如何停止 postgres 吗?
  • @MichaelKrelin-hacker,不一定。该应用程序可能是一个命令/响应服务器,作为其操作之一,它启动系统的数据库。这表明(以 root 身份运行、将资源泄漏给子进程等)是另一回事。 :)
  • 但是它说“我看到 postgres 正在监听那个端口”?
  • 是的,因为 postgres 继承了 OP 应用程序打开的套接字。如果应用程序在启动 postgres 之前也打开了/dev/null 并创建了一个pipe()lsof 将表明后代 postgres 也持有/dev/null 和一个pipe()
  • 呃,我希望这是一些系统管理应用,否则在你的应用中启动 postgres 听起来很不对。

标签: c++ sockets postgresql port ace


【解决方案1】:

有没有办法关闭端口?

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

或者 ... 将您对子进程 (...postgresql start) 的调用封装起来,以关闭高于 stderr 的 fd:

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

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

为什么 postgres 监听那个端口?

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

【讨论】:

  • 有没有办法以不继承打开文件描述符的方式启动子进程?
  • @Shay,是的。要么在执行子进程之前关闭描述符(close(the_right_fd) 或 FD_CLOEXEC),要么像 perl sn-p 那样循环遍历 fd 表并希望最好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-19
  • 1970-01-01
  • 1970-01-01
  • 2020-08-03
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
相关资源
最近更新 更多