web-dev-qa-db-ja.com

フォークされたプロセスでソケット接続はどのように処理されますか

たとえば、ポート5000をリッスンするTCPサーバーとして機能するプログラムがあります。

ここで、別のコマンドラインプロセスを実行して、このサーバーと並行して実行したいと思います。私はそれを行う正しい方法が「exec」を呼び出すよりもサーバーをフォークすることであることを知っています..。

私の質問は、子プロセスもこのポート5000を「所有」しているのでしょうか。このポート5000を解放したい場合、親プロセスと子プロセスの両方を強制終了する必要がありますか?

このソケット接続がフォークでどのように処理されているのか非常に興味があります。

32
Vendetta
  1. まず、accept()着信接続。受け入れプロセスには、リスニングソケットと新しく受け入れられたソケットへのハンドルがあります。
  2. フォークと:
    • 子供の場合:
      1. リスニングソケットを閉じます。
      2. 受け入れられたソケットで何かをします。
    • 親の場合:
      1. 受け入れられたソケットを閉じます。
      2. 受け入れループを再開します。

ハンドルへのすべての参照が閉じられると、さまざまなソケットリソースが再利用されます。プロセスが終了すると、そのすべてのハンドルが暗黙的に閉じられます。したがって、子がリスニングソケットに継承するハンドルを閉じると、そのソケットに残っている唯一のハンドルが親に存在します。次に、親が終了するか、このハンドルを明示的に閉じると、リスニングソケットが再利用されます。

24
Matt Joiner

はい、そうです
子プロセスが作成されるたびに、親プロセスからファイル記述子テーブルのコピーを取得します。また、各ファイル記述子に対応する参照カウント、つまり現在ファイル/ソケットにアクセスしているプロセスの数があります。したがって、ソケットがマスタープロセスで開かれ、子プロセスが作成されると、参照カウントが増加します。これは、ソケットが子プロセスでも開かれているためです。いずれかのプロセスでソケットが閉じられると、ソケットは減少します。参照カウントがゼロに達すると、ソケットは最終的に閉じられます。

18
mandavi