2011-10-25 11 views
1

私はLinuxアプリケーションをC++で書いています。 アプリケーションは、特定のポート上のソケットをリッスンします。 ACEアクセプタを使って実装しました。 さらに、アプリケーションは、ACE_OS ::システム関数を呼び出すことによって、initスクリプト/etc/init.d/postgresql startを使用してpostgresqlデータベースを起動します。ポートリスニングの停止方法

問題は次のとおりです。アプリケーションが終了すると、ポートはまだ占有されています。 netstatを実行すると、ポストグルがそのポートをリッスンしていることがわかります。 (これは特定のポート上のアプリケーションからpostgresを起動する場合にのみ発生します)。

ポートを閉じる方法はありますか?なぜポストグルはそのポートを聞いているのですか?

+1

実際にpostgresを停止する方法はあなたの質問ではありませんか? –

+0

@ MichaelKrelin-hacker、必ずしもそうではありません。このアプリケーションは、アクションの1つとして、システムのデータベースを起動するコマンド/レスポンスサーバーです。これが示唆していること(ルートとして実行する、子プロセスにリソースをリークするなど)は別のものです。 :) – pilcrow

+0

しかし、それは "私はポストグルがそのポートを聞いているのを見る"と言う? –

答えて

3

ポートを閉じる方法はありますか?

はい。ソケットを閉じるか、基礎となるファイル記述子にFD_CLOEXECを設定します。

それとも... stderrをより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、はい。 – Shay

+0

子を実行する前に(close(the_right_fd)またはFD_CLOEXEC)記述子を閉じるか、またはperlスニペットのようにfdテーブルをループして、最高のものをお探しください。 – pilcrow

関連する問題