Kümmert sich Windows darum, Sockets zu schließen, wenn Prozesse beendet werden?

12

Ich habe diese Frage zu Linux gelesen. Kann ein Port gebunden werden, wenn der Prozess beendet wurde?
Linux scheint nach dem Beenden von Prozessen aufzuräumen und offene Sockets zu lassen. Ich habe mich gefragt, ob es eine Spezifikation gibt, wie dies unter Windows funktioniert. Kümmert sich das Betriebssystem konsequent um das Schließen von Sockets für Prozesse, die beendet werden, ohne sie zu schließen?

Simone
quelle

Antworten:

10

Unter Windows und Unixen schließt der Kernel beim Beenden eines Prozesses alle offenen Handles.

Windows NT

Beenden eines Prozesses - MSDN

Das Beenden eines Prozesses hat folgende Ergebnisse:

  • [...]
  • Alle vom Prozess zugewiesenen Ressourcen werden freigegeben.
  • Alle Kernelobjekte sind geschlossen.
  • [...]

Während offene Handles für Kernelobjekte beim Beenden eines Prozesses automatisch geschlossen werden, sind die Objekte selbst so lange vorhanden, bis alle offenen Handles für sie geschlossen sind. Daher bleibt ein Objekt gültig, nachdem ein Prozess, der es verwendet, beendet wurde, wenn ein anderer Prozess ein offenes Handle hat.

ExitProcessFunktion - MSDN

Das Beenden eines Prozesses verursacht Folgendes:

  • [...]
  • Alle vom Prozess geöffneten Objekthandles werden geschlossen.
  • [...]

Linux

exit(3) - Linux-Programmierhandbuch (libc-Funktionen)

Alle offenen stdio (3) Streams werden gespült und geschlossen.

_exit(2) - Linux Programmer's Manual (Kernel-Systemaufrufe)

Die Funktion _exit()beendet den aufrufenden Prozess "sofort". Alle zum Prozess gehörenden offenen Dateideskriptoren werden geschlossen. Alle untergeordneten Elemente des Prozesses werden von Prozess 1, init , geerbt , und dem übergeordneten Element des Prozesses wird ein SIGCHLD-Signal gesendet.


Beachten Sie, dass auf beiden Betriebssystemen

  1. Sockets sind nur eine Art von Dateideskriptoren (fd's) / Kernel-Objekten. Daher gilt das oben Gesagte gleichermaßen für Dateien und Sockets.

  2. Dateibeschreibungen auf Unix, sowie Objekt - Handles Kernel - Objekte unter Windows können durch besessen werden mehrere Prozesse - sie ihre Griffe von untergeordneten Prozessen geerbt werden kann und sogar spezielle IPC - Funktionen übergeben um mit.

  3. Eine Datei oder ein Socket wird nur geschlossen, wenn alle darauf zeigenden fd zerstört sind.

user1686
quelle
2
TCP-Sockets sind aufgrund ihrer TIME_WAIT-Zustände ein Sonderfall. Wenn Sie beispielsweise eine Anwendung beenden, die einen TCP-Port überwacht, können Sie häufig nicht sofort eine Bindung an denselben Port herstellen.
Haimg
2
Nr Datei - Deskriptoren und Objekt Griffe sind im Besitz von und zugänglich nur ein Prozess, und sind streng pro Prozess Einheiten. Es ist die Dateibeschreibung und das zugrunde liegende Objekt , das unter den Prozessen gemeinsam genutzt werden.
JdeBP
5

Unter Windows ist ein Socket eine Verbindung zwischen einem Kommunikationsendpunkt und einem Prozess. Aus diesem Grund erhalten Sie beim Duplizieren eines Sockets zwei Sockets, aber nur einen Endpunkt. Aus diesem Grund können Sie einen Socket nicht von einem Prozess an einen anderen übergeben, ohne im anderen Prozess einen neuen Socket zu erstellen.

Wenn der Prozess aufhört zu existieren, hören seine Sockets notwendigerweise auf zu existieren. Es gibt kein Konzept für einen Socket ohne einen Prozess, um ihn zu halten. Aus diesem Grund müssen selbst Windows-Kerneltreiber, die Sockets auf Kernelebene erstellen möchten , einen Prozess angeben, um den Socket zu besitzen, oder die Funktion aus einem Prozesskontext aufrufen, dem der Socket gehören kann. (Oder sie können die Endpunkte direkt ohne Verwendung von Sockets bearbeiten.)

Ihre Frage scheint wirklich nicht Sockets zu sein, sondern die Kommunikationsendpunkte selbst. Ein Socket hat einen Verweis auf seinen Kommunikationsendpunkt. Wenn die Steckdose wegfällt, sinkt die Referenzanzahl. Wenn es Null erreicht, wird es entfernt, sobald dies angesichts der Anforderungen des Kommunikationsprotokolls, dem der Endpunkt zugeordnet ist, zulässig ist. TCP hat den Status TIME_WAIT, in dem der Endpunkt beibehalten werden muss, um alle "verbleibenden" Pakete zu verarbeiten.

David Schwartz
quelle
3

Ja tut es. Auf diese Weise wurde Windows 3.1 95 98 XP erkannt (zumindest weiß ich es seit XP genau).

Scott Chamberlain
quelle
1
Nein, hat es nicht. Vielleicht seit Windows NT Version 3. 5 . Aber DOS-Windows war ein ganz anderes Tier als Windows NT, wenn es um Sockets ging. und DOS-Windows 95 unterschieden sich außerdem erheblich von DOS-Windows 3.1. Win16-Anwendungen mussten aufrufen, da WSACleanup()sonst Lecks auftraten. und es gab ein böses Problem in DOS-Windows 9x, das im MSKB-Artikel Nr. 156319 dokumentiert ist, bei dem übergeordnete Prozesse Sockets ungültig machten, die an ihre untergeordneten Elemente übergeben wurden, verursacht durch die ziemlich unterschiedliche Prozess-Exit-Semantik von DOS-Windows für Sockets.
JdeBP
1
@JdeBP: Was ist mit Windows NT 3. 1 - Hat es eine automatische Bereinigung durchgeführt?
Benutzer1686
1
3.1 hatte überhaupt keine Steckdosen.
JdeBP
... Guter Punkt, @JdeBP - daran habe ich nicht gedacht.
user1686
@JdeBP Die Antwort wurde aktualisiert, um sie zu korrigieren.
Scott Chamberlain