2011-07-05 9 views
7

Microsoft jugó seguro aquí. En su artículo, "Creating a Child Process with Redirected Input and Output", dicen:¿Debo cerrar el identificador heredado que luego pertenece al proceso hijo?

Las manijas abiertas restantes se limpian cuando finaliza este proceso.
Para evitar pérdidas de recursos en una aplicación más grande, cierre los identificadores explícitamente.

Lo cual es completamente inútil. ¿Qué maneja? En que proceso?


Quiero entenderlo.

Cuando se crea un identificador en el proceso primario con SECURITY_ATTRIBUTES.bInheritHandle = TRUE, un proceso hijo puede verlo y usarlo, y el identificador tiene el mismo valor y derechos de acceso en ambos procesos.

¿Pero es el mismo identificador, o es una copia que tiene la misma representación numérica?

Si paso un mango hRead a un proceso hijo para que se pueda leer desde una tubería, y el proceso hijo cierra el mango, ¿también tienen que cerrarla desde el proceso padre? ¿No va a limpiar la tubería del proceso secundario?

Mis experimentos muestran que CloseHandle vuelve al éxito cuando se intenta cerrar un identificador hRead pasado al niño después de que el niño lo haya cerrado. Esto aboga fuertemente por Sí, deberías cerrarlo. Sin embargo, agradecería un consejo más sólido aquí.

Respuesta

10

Golpeas el clavo en la cabeza. Los identificadores Win32 actúan como referencias de modo de usuario a un objeto subyacente del modo kernel. Los identificadores (referencias) a objetos nuevos y existentes se crean típicamente a través de algún tipo de llamada CreateXXX; se pueden crear referencias adicionales en el proceso actual u otros, llamando al DuplicateHandle - {o marcando un manejador como heredable y creando un nuevo proceso - que duplica un identificador del proceso actual en el proceso secundario, asegurándose de que el valor del identificador sea idéntico.}

En ese punto, hay (al menos) dos referencias al objeto kernel, que deben cerrarse a desbloquee el objeto y libere todos los recursos consumidos.

+0

Ah. Por lo tanto, el identificador * se * clona cuando genero un proceso hijo. Eso es lo que buscaba. – GSerg

Cuestiones relacionadas