Windows prend-il soin de fermer les sockets lorsque les processus se terminent?

12

J'ai lu cette question sur Linux, un port peut-il être lié lorsque le processus est terminé?
Linux semble nettoyer après la fermeture des processus et laisser les sockets ouverts. Je me demandais s'il y avait des spécifications sur la façon dont cela fonctionne sous Windows. Le système d'exploitation prend-il systématiquement en charge la fermeture des sockets pour les processus qui se terminent sans les fermer?

Simone
la source

Réponses:

10

Sous Windows et Unixen, lorsqu'un processus se termine, le noyau ferme tous les descripteurs ouverts.

Windows NT

Mettre fin à un processus - MSDN

La fin d'un processus a les résultats suivants:

  • [...]
  • Toutes les ressources allouées par le processus sont libérées.
  • Tous les objets du noyau sont fermés.
  • [...]

Alors que les poignées ouvertes vers les objets du noyau sont fermées automatiquement à la fin d'un processus, les objets eux-mêmes existent jusqu'à ce que toutes les poignées ouvertes vers eux soient fermées. Par conséquent, un objet restera valide après la fin d'un processus qui l'utilise si un autre processus a un descripteur ouvert.

ExitProcessfonction - MSDN

Quitter un processus provoque les événements suivants:

  • [...]
  • Tous les descripteurs d'objet ouverts par le processus sont fermés.
  • [...]

Linux

exit(3) - Manuel du programmeur Linux (fonctions libc)

Tous les flux stdio (3) ouverts sont vidés et fermés.

_exit(2) - Manuel du programmeur Linux (appels système du noyau)

La fonction _exit()met fin au processus d'appel "immédiatement". Tous les descripteurs de fichiers ouverts appartenant au processus sont fermés; tous les enfants du processus sont hérités par le processus 1, init , et le parent du processus reçoit un signal SIGCHLD.


Notez que sur les deux systèmes d'exploitation,

  1. Les sockets sont juste un type d'objets descripteurs de fichiers (fd) / noyau, donc ce qui précède s'applique également aux fichiers et aux sockets.

  2. Description des fichiers sur Unix, ainsi que des poignées d'objets les objets de sous Windows, peuvent appartenir à plusieurs processus - ils leurs poignées peuvent être héritées par les processus enfants et même passés autour de l' utilisation des fonctions spéciales IPC.

  3. Un fichier ou un socket n'est fermé que lorsque tous les fd pointant vers lui sont détruits.

user1686
la source
2
Les sockets TCP sont un cas particulier, en raison de leurs états TIME_WAIT. Par exemple, si vous arrêtez une application à l'écoute sur un port TCP, vous ne pouvez souvent pas vous lier immédiatement au même port.
haimg
2
Fichier No descripteurs et objets poignées sont la propriété et accessible à seulement un processus, et sont strictement par processus entités. Ce sont la description du fichier et l'objet sous-jacent qui sont partagés entre les processus.
JdeBP
5

Sous Windows, un socket est un lien entre un point de terminaison de communication et un processus. C'est pourquoi, lorsque vous dupliquez un socket, vous vous retrouvez avec deux sockets mais un seul point de terminaison. C'est pourquoi vous ne pouvez pas passer un socket d'un processus à un autre sans créer un nouveau socket dans l'autre processus.

Si le processus cesse d'exister, ses sockets cessent nécessairement d'exister. Il n'y a pas de concept de socket sans processus pour le maintenir. C'est pourquoi même les pilotes du noyau Windows qui souhaitent créer des sockets au niveau du noyau doivent spécifier un processus pour posséder le socket ou appeler la fonction à partir d'un contexte de processus qui peut posséder le socket. (Ou ils peuvent manipuler les points d'extrémité directement sans utiliser de sockets.)

Votre question ne semble pas vraiment concerner les sockets mais les points de terminaison de communication eux-mêmes. Un socket a une référence à son point de terminaison de communication. Lorsque le socket disparaît, le nombre de références diminue. S'il atteint zéro, il sera supprimé dès que cela est autorisé compte tenu des exigences du protocole de communication auquel le point d'extrémité est associé. TCP a un état TIME_WAIT pendant lequel le point de terminaison doit être conservé pour gérer tous les paquets "restants".

David Schwartz
la source
3

Oui. Il en a été ainsi de détection des fenêtres 3.1 95 98 XP (au moins je sais pour sûr depuis XP).

Scott Chamberlain
la source
1
Non, ce n'est pas le cas. Depuis Windows NT version 3. 5 , peut-être. Mais DOS-Windows était un animal très différent de Windows NT en ce qui concerne les sockets; De plus, DOS-Windows 95 diffère considérablement de DOS-Windows 3.1. Applications Win16 ont été nécessaires pour appeler WSACleanup()autrement les fuites ont eu lieu; et il y avait un problème désagréable dans DOS-Windows 9x, documenté dans l'article MSKB # 156319, avec des processus parents invalidant les sockets transmis à leurs enfants, causé par la sémantique de sortie de processus plutôt différente de DOS-Windows pour les sockets.
JdeBP
1
@JdeBP: Qu'en est-il de Windows NT 3. 1 - at-il effectué un nettoyage automatique?
user1686
1
3.1 n'avait pas de prises en premier lieu.
JdeBP
... Bon point, @JdeBP - Je n'y ai pas pensé.
user1686
@JdeBP Réponse mise à jour pour la corriger.
Scott Chamberlain