如何停止监听端口 我有一个用C++编写的Linux应用程序。 应用程序侦听某个端口上的套接字。我使用ACE Acceptor实现了这一点。 此外,应用程序通过调用ACE_OS::system函数,使用init脚本/etc/init.d/postgresql start启动postgresql数据库
我遇到的问题是:当应用程序退出时,端口仍然被占用。当我运行netstat时,我看到postgres正在侦听该端口。(只有在任何给定端口上从应用程序启动postgres时,才会发生这种情况) 有办法关闭港口吗?为什么博士后听那个端口 有办法关闭港口吗 对。关闭套接字,或在底层文件描述符上设置FD_CLOEXEC 或者。。。将对子进程(如何停止监听端口 我有一个用C++编写的Linux应用程序。 应用程序侦听某个端口上的套接字。我使用ACE Acceptor实现了这一点。 此外,应用程序通过调用ACE_OS::system函数,使用init脚本/etc/init.d/postgresql start启动postgresql数据库,c++,sockets,postgresql,port,ace,C++,Sockets,Postgresql,Port,Ace,我遇到的问题是:当应用程序退出时,端口仍然被占用。当我运行netstat时,我看到postgres正在侦听该端口。(只有在任何给定端口上从应用程序启动postgres时,才会发生这种情况) 有办法关闭港口吗?为什么博士后听那个端口 有办法关闭港口吗 对。关闭套接字,或在底层文件描述符上设置FD_CLOEXEC 或者。。。将对子进程(…postgresql start)的调用包装为将关闭高于stderr的fds的内容: ACE_OS::system("perl -MPOSIX -e 'POSIX:
…postgresql start
)的调用包装为将关闭高于stderr的fds的内容:
ACE_OS::system("perl -MPOSIX -e 'POSIX::close($_) for 3 .. sysconf(_SC_OPEN_MAX); exec @ARGV' /etc/init.d/postgresql start");
或类似的。把它塞进剧本里,让它看起来更好看
为什么博士后听那个端口
您的子进程(及其子女)继承了您的开放文件描述符,包括打开C++应用程序的套接字。
这不是你的问题,实际上是如何阻止PigGrice?@ Migelkrin黑客,不一定。该应用程序可能是一个命令/响应服务器,作为其操作之一,它可以启动系统的数据库。这意味着(以root用户身份运行、将资源泄漏给子进程等)还有其他方面的问题但上面写着“我看到postgres正在监听这个端口”?是的,因为postgres继承了OP应用程序打开的套接字。如果应用程序在启动postgres之前也打开了/dev/null
并制作了一个pipe()
,lsof
将显示后代postgres也持有/dev/null
和一个pipe()
。呃,我希望这是一个系统管理应用程序,因为在应用程序中启动postgres听起来非常错误。有没有一种方法可以以不继承打开的文件描述符的方式启动子进程?@Shay,是的。要么在执行子级之前关闭描述符(close(the_right_fd)或fd_CLOEXEC),要么像perl代码片段那样循环fd表,希望一切顺利。