web-dev-qa-db-ja.com

プロセスが終了すると、Windowsはソケットを閉じる処理を行いますか?

Linuxに関するこの質問を読みました プロセスが終了したときにポートをバインドできますか?
Linuxは、プロセスが終了し、開いたソケットを残した後にクリーンアップするように見えます。これがWindowsでどのように機能するかについての仕様があるかどうか疑問に思いました。 OSは、プロセスを閉じずに終了するプロセスのソケットを常に閉じていますか?

12
Simone

WindowsとUnixenの両方で、プロセスが終了すると、カーネルは開いているすべてのハンドルを閉じます。

Windows NT

プロセスの終了 – MSDN

プロセスを終了すると、次の結果が得られます。

  • [...]
  • プロセスによって割り当てられたリソースはすべて解放されます。
  • すべてのカーネルオブジェクトが閉じられます。
  • [...]

カーネルオブジェクトへの開いているハンドルは、プロセスが終了すると自動的に閉じられますが、オブジェクト自体は、開いているすべてのハンドルが閉じられるまで存在します。したがって、別のプロセスが開いているハンドルを持っている場合、オブジェクトを使用しているプロセスが終了した後も、オブジェクトは有効なままになります。

ExitProcess function – MSDN

プロセスを終了すると、次のようになります。

  • [...]
  • プロセスによって開かれたすべてのオブジェクトハンドルが閉じられます。
  • [...]

Linux

exit(3) – Linuxプログラマーズマニュアル(libc関数)

すべての開いているstdio(3)ストリームがフラッシュされ、閉じられます。

_exit(2) – Linuxプログラマーズマニュアル(カーネルシステムコール)

関数_exit()は、呼び出しプロセスを「すぐに」終了します。プロセスに属する開いているファイル記述子はすべて閉じられます。プロセスの子はすべてプロセス1initに継承され、プロセスの親にはSIGCHLDシグナルが送信されます。


両方のオペレーティングシステムで、

  1. ソケットはファイル記述子(fd)/カーネルオブジェクトの一種にすぎないため、上記はファイルとソケットに等しく当てはまります。

  2. Unixでのファイルの説明、および オブジェクトハンドル Windows上のカーネルオブジェクトは、複数のプロセスが所有できます– 彼ら それらのハンドルは子プロセスに継承でき、特別なIPC関数を使用して渡すこともできます。

  3. ファイルまたはソケットは、それを指しているallfdが破棄された場合にのみ閉じられます。

10
user1686

Windowsでは、ソケットは通信エンドポイントとプロセスの間のリンクです。これが、ソケットを複製すると、2つのソケットになりますが、エンドポイントは1つだけになる理由です。これが、他のプロセスで新しいソケットを作成せずに、あるプロセスから別のプロセスにソケットを渡すことができない理由です。

プロセスが存在しなくなると、そのソケットは必然的に存在しなくなります。ソケットを保持するプロセスがなければ、ソケットの概念はありません。これが、 カーネルレベルでソケットを作成したいWindowsカーネルドライバー でさえ、ソケットを所有するプロセスを指定するか、ソケットを所有できるプロセスコンテキストから関数を呼び出す必要がある理由です。 (または、ソケットを使用せずにエンドポイントを直接操作できます。)

あなたの質問は、実際にはソケットではなく、通信エンドポイント自体に関するもののようです。ソケットには、その通信エンドポイントへの参照があります。ソケットがなくなると、参照カウントが低下します。ゼロに達した場合、エンドポイントが関連付けられている通信プロトコルの要件を考慮して、許容されるとすぐに削除されます。 TCPにはTIME_WAIT状態があり、その間、エンドポイントは「残りの」パケットを処理するために維持する必要があります。

5
David Schwartz

はい、そうです。このようにセンスウィンドウでした 3.19598XP (少なくとも私はXP以来確かに知っています)。

3