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?

¿Fue útil?

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 es 0x1234.
  • 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 llamar CreateEvent o OpenEvent. 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:

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top