1

私はc++で書かれたLinuxアプリケーションを持っています。アプリケーションは特定のポートでソケットをリッスンします。私はACEAcceptorを使用してこれを実装しました。さらに、アプリケーションは、初期化スクリプト/etc/init.d/postgresqlを使用してpostgresqlデータベースを開始し、ACE_OS::system関数を呼び出して開始します。

私が抱えている問題は次のとおりです。アプリケーションが終了しても、ポートはまだ使用されています。netstatを実行すると、postgresがそのポートをリッスンしていることがわかります。(これは、特定のポートでアプリケーションからpostgresを開始した場合にのみ発生します)。

ポートを閉じる方法はありますか?postgresがそのポートをリッスンするのはなぜですか?

4

1 に答える 1

3

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

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

または...子プロセス(...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");

または類似。それをスクリプトに入れて、見栄えを良くします。

postgresがそのポートをリッスンするのはなぜですか?

子プロセス(およびその子)は、c++アプリが開くソケットを含む開いているファイル記述子を継承しています。

于 2011-10-25T21:04:32.373 に答える