2011-10-25 138 views
1

我有一個用C++編寫的linux應用程序。 應用程序偵聽某個端口上的套接字。我使用ACE Acceptor實現了這一點。 此外,應用程序使用init腳本/etc/init.d/postgresql啓動postgresql數據庫,通過調用ACE_OS :: system函數啓動。如何停止監聽端口

我遇到的問題是:當應用程序退出時,端口仍然被佔用。當我運行netstat時,我發現postgres正在監聽那個端口。 (這隻會發生,如果我從任何給定的端口上的應用程序啓動postgres)。

有沒有辦法關閉端口?爲什麼postgres會聽那個端口?

+1

是不是你的問題,如何停止postgres? –

+0

@ MichaelKrelin-黑客,不一定。該應用程序可能是一個命令/響應服務器,作爲其操作之一,啓動系統的數據庫。這表明(以root身份運行,將資源泄露給子進程等)是另一回事。 :) – pilcrow

+0

但它說「我看到postgres正在聽該端口」? –

回答

3

有沒有辦法關閉端口?

是的。關閉套接字,或在底層文件描述符上設置FD_CLOEXEC。

還是......有東西,這將不是標準錯誤關閉FDS更高的包裹你的子進程(...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++應用程序打開的套接字。

+0

有沒有辦法以不會繼承打開的文件描述符的方式啓動子進程? – Shay

+0

@Shay,是的。在執行子進程之前關閉描述符(關閉(the_right_fd)或FD_CLOEXEC)或者按照perl代碼片段循環訪問fd表,並希望獲得最佳效果。 – pilcrow