¿Qué significa: “Un proceso hijo puede heredar el mango”?
Pregunta
Hay algunos objetos Win32 que según el SDK puede ser "heredadas" para el niño-procesos creados por el proceso dado. (Eventos, mutex, tuberías, ...)
¿Qué significa realmente?
Vamos a decir que tengo un objeto denominado evento, creado con CreateEvent
, una vez con bInheritHandle == true
, y otro == false
tiempo.
Ahora a empezar un proceso hijo. ¿Cómo esos dos asas de eventos afectan el proceso hijo? En qué escenarios se diferencian?
Solución
Si crea / abrir un objeto y permitir que la manilla para ser heredada, los procesos secundarios que están autorizados para heredar asas (por ejemplo, puede especificar bInheritHandles = TRUE
de CreateProcess) tendrá copias de las manijas. Las manijas del heredados tendrán los mismos valores de identificador que se encarga de la matriz. Así, por ejemplo:
-
CreateEvent
devuelve un identificador para un objeto de evento, mango es0x1234
. - Usted permite que la manilla para ser heredada.
- Se crea un proceso hijo que hereda sus manijas.
- Ese proceso hijo puede ahora utilizar
0x1234
mango sin tener que llamarCreateEvent
oOpenEvent
. Por ejemplo, podría pasar el valor mango en la línea de comandos del proceso hijo.
Esto es útil para objetos sin nombre - ya que son sin nombre, otros procesos no pueden abrirlos. El uso de procesos hijo de herencia mango puede obtener identificadores de objetos no identificados si se desea.
Otros consejos
Un punto que no se ha hecho en las respuestas existentes es que permite un proceso hijo para heredar los mangos no sólo afecta el proceso hijo; también puede afectar a la vida útil del objeto al que se refieren las asas. Si el proceso padre sale, las asas en el proceso hijo se mantendrá el objeto vivo.
Cuando se permite un proceso hijo herede maneja debe tener en cuenta si va a resultar en un objeto viven más tiempo de lo debido; Por ejemplo, algunas aplicaciones sólo quieren permitir una instancia para ejecutar a la vez, y podrían hacerlo mediante la creación de un objeto de evento con un nombre dado y ver si ya existe. Si crean un proceso hijo que hereda ese objeto de evento, y sobrevive a los padres, que podría dar lugar a un falso positivo.
Más comúnmente, un mango heredado a un archivo puede resultar en el archivo restante en uso (y por lo tanto inaccesible) más largo de lo que debería tener.
Por esta razón, la mejor práctica es:
-
Hacer todos los mangos como no se puede heredar a menos que necesiten específicamente para ser heredada.
-
Si un subproceso no necesita heredar mangos, pasar
FALSE
parabInheritHandles
. -
Si un subproceso necesita para heredar las manijas, sólo se permita que se heredan las manijas específicas que se necesitan .
Por otro lado, esta vez en cuando puede ser útil; por ejemplo, si desea el proceso hijo para contar como una instancia del proceso padre, o para que un archivo permanecen inaccesibles hasta que el hijo ha terminado. Otro truco es tener un niño hereda un identificador a un objeto nombrado y luego usar la existencia o no existencia del objeto para determinar si el niño está todavía vivo, sin tener que pasar alrededor de un identificador de proceso o ID de proceso.
Si crea un evento, y permitir que el mango para ser heredado por los procesos secundarios, entonces el proceso hijo puede usar el mango para el mismo objeto exacto creado por el padre. Esto puede ser usado de una manera en que un niño utiliza un controlador de eventos para señalar a los padres cuando una tarea se ha completado (hay muchos otros usos para el objeto de evento heredable asas).
EDIT: desinformación eliminado.