3

TCPソケット5060でリッスンしているSIPサーバー(デーモン)があります。この親プロセスで子プロセスを作成し、子プロセスで何かを行います。ここで、親プロセスでこの tcp ソケットを閉じて再度作成しようとすると (このサーバーで SIP を無効にしてから有効にするとします)、このソケットを作成するとエラーが発生します。この問題をデバッグし、根本原因を見つけました。根本的な原因は、子が作成されたときに、開いているすべての fd/socket を親から継承 (コピーを取得) することです。親がtcpソケットを閉じると、それはまだ子で開かれているため(ref_counter!= 0)、親でソケットを再度開くことはできません!!

今、私が望む一般的な解決策は - 子プロセスが開始されるとすぐに、開いている fd (IPv4/TCP タイプ) をチェックし、親にこの子プロセスの副作用がないようにそれらを閉じます。これは C-unix でどのように行うことができますか? system(lsof | grep | awk) の方向に実行してファイル記述子を取得することを考えましたが、どうすればそれらを閉じることができますか? child のソケットを閉じる他の解決策はありますか? ポート番号を渡すことができ、すでに作成された fd を取得できる方法はありますか?

私が望まない解決策は(私にとっては役に立ちません)
-1.親プロセスで、最初にフラグ付きのtcpソケットを作成しているため、子によってコピーされません。(親でそのソケットの作成を変更することはできません)! 2. 子プロセスの作成時に、ファイル記述子を親から子に渡します。私はそのfdを持っていないので、それを行うことはできません。解決策は、子プロセスに入れる必要があるものでなければなりません!

ありがとう

4

3 に答える 3

4

ファイル記述子があります。必要のないものは閉じてください。

子では、リッスン ソケットを閉じる必要があります。

親では、受け入れたソケット (= 新しい接続) を閉じる必要があります。

于 2013-10-11T13:51:29.220 に答える