¿Windows se encarga de cerrar los sockets cuando salen los procesos?


Respuestas:


10

Tanto en Windows como en Unixen, cuando sale un proceso, el núcleo cierra todos los identificadores abiertos.

Windows NT

Terminar un proceso - MSDN

Terminar un proceso tiene los siguientes resultados:

  • [...]
  • Cualquier recurso asignado por el proceso se libera.
  • Todos los objetos del núcleo están cerrados.
  • [...]

Si bien los identificadores abiertos para los objetos del núcleo se cierran automáticamente cuando finaliza un proceso, los objetos mismos existen hasta que se cierran todos los identificadores abiertos para ellos. Por lo tanto, un objeto seguirá siendo válido después de que un proceso que lo esté utilizando termine si otro proceso tiene un identificador abierto.

ExitProcessfunción - MSDN

Salir de un proceso provoca lo siguiente:

  • [...]
  • Todos los identificadores de objetos abiertos por el proceso están cerrados.
  • [...]

Linux

exit(3) - Manual del programador de Linux (funciones de libc)

Todas las secuencias abiertas de stdio (3) se vacían y se cierran.

_exit(2) - Manual del programador de Linux (llamadas al sistema del núcleo)

La función _exit()finaliza el proceso de llamada "inmediatamente". Cualquier descriptor de archivo abierto que pertenezca al proceso está cerrado; cualquier proceso secundario del proceso es heredado por el proceso 1, init , y el padre del proceso recibe una señal SIGCHLD.


Tenga en cuenta que en ambos sistemas operativos,

  1. Los sockets son solo un tipo de descriptores de archivo (fd's) / objetos de kernel, por lo que lo anterior se aplica igualmente a los archivos y sockets.

  2. Las descripciones de archivos en Unix, así como los identificadores de objetos del núcleo en Windows, pueden ser propiedad de múltiples procesos; estos identificadores pueden ser heredados por procesos secundarios e incluso transmitidos mediante funciones especiales de IPC.

  3. Un archivo o socket solo se cierra cuando se destruyen todos los fd que apuntan a él.


2
Los sockets TCP son un caso especial, debido a sus estados TIME_WAIT. Por ejemplo, si finaliza una aplicación que escucha en un puerto TCP, a menudo no puede vincularse al mismo puerto de inmediato.
Haimg

2
No. Los descriptores de archivo y los identificadores de objeto son propiedad de un solo proceso y son accesibles para ellos , y son estrictamente entidades por proceso . Es la descripción del archivo y el objeto subyacente que se comparten entre los procesos.
JdeBP

5

En Windows, un socket es un enlace entre un punto final de comunicaciones y un proceso. Es por eso que, cuando duplica un socket, termina con dos sockets pero solo un punto final. Es por eso que no puede pasar un socket de un proceso a otro sin crear un nuevo socket en el otro proceso.

Si el proceso deja de existir, sus enchufes necesariamente dejan de existir. No existe un concepto de socket sin un proceso para mantenerlo. Esta es la razón por la que incluso los controladores de kernel de Windows que desean crear sockets a nivel de kernel deben especificar un proceso para ser el propietario del socket o llamar a la función desde un contexto de proceso que pueda ser el propietario del socket. (O pueden manipular los puntos finales directamente sin usar sockets).

Su pregunta parece no ser realmente sobre sockets sino sobre los puntos finales de comunicación en sí mismos. Un socket tiene una referencia a su punto final de comunicación. Cuando el zócalo desaparece, el recuento de referencia cae. Si llega a cero, se eliminará tan pronto como sea permitido, dados los requisitos del protocolo de comunicación con el que está asociado el punto final. TCP tiene un estado TIME_WAIT durante el cual el punto final debe mantenerse para manejar cualquier paquete "sobrante".


3

Si lo hace Ha sido así sentir Windows 3.1 95 98 XP (al menos lo sé con certeza desde XP).


1
No, no lo ha hecho. Desde Windows NT versión 3. 5 , tal vez. Pero DOS-Windows era un animal muy diferente a Windows NT cuando se trataba de sockets; y DOS-Windows 95 diferían significativamente de DOS-Windows 3.1, además. Se requería que las aplicaciones Win16 llamaran WSACleanup(); de lo contrario, se produjeron fugas; y hubo un problema desagradable en DOS-Windows 9x, documentado en el artículo # 156319 de MSKB, con procesos primarios que invalidaban los sockets pasados ​​a sus hijos, causado por la semántica de salida de proceso de DOS-Windows bastante diferente para los sockets.
JdeBP

1
@JdeBP: ¿Qué pasa con Windows NT 3. 1 - realizó la limpieza automática?
user1686

1
3.1 no tenía enchufes en primer lugar.
JdeBP

... Buen punto, @JdeBP - No pensé en eso.
user1686

@JdeBP Respuesta actualizada para corregirlo.
Scott Chamberlain
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.