Pregunta

Cuando se crea un proceso hijo en C ++ usando la API de Windows, se puede permitir que la herencia de las manijas de padres a hijos. En un ejemplo Microsoft "Creación de un proceso Niño con entrada y redirigidas de salida, la reorientación de un proceso hijo std "de entrada / salida a las tuberías creadas por el padre, que es necesario para permitir la herencia para las tuberías de redirección sea utilizable.

Estoy trabajando en una pequeña clase de demostración de que el lanzamiento de un ejecutable externo, lee la salida, y luego la escupe de nuevo a la persona que llama (que registra la salida devuelta a un archivo). Estoy tratando de construir en una característica de tiempo de espera, en el que sólo se bloqueará por una cierta cantidad de tiempo antes de llamar TerminateProcess() en el niño y continuar con su vida.

Sin embargo, he encontrado que al permitir la herencia mango, el proceso hijo también tiene un mango (visible con Process Explorer ) para el archivo de salida. No quiero que el proceso hijo para obtener este mango, pero el padre en este caso (esta clase de demostración) no tiene conocimiento de la manija tampoco, así que no puedo utilizar actualmente SetHandleInformation() a desmarcar el archivo de salida específicamente para excluirlo de la herencia.

Estoy seguro de que debe haber una mejor manera de heredar sólo las asas específicas que quiero, sin permitir que la herencia "manta" que pasa mangos no deseados y no deseados. Por desgracia no he sido capaz de encontrar una solución, después de haber navegado por el mayor número de artículos de MSDN relacionados como puedo encontrar, y después de haber buscado en Google a mí mismo en un estado de desánimo.

Por lo menos, tengo que hacer algo para quitar las manijas del niño, sin tener necesariamente las manijas dentro de la clase de demostración (son utilizados por la clase llamando, y esta demo clase no tiene conocimiento explícito de su existencia).

Cualquier soluciones para la herencia más selectivo? Estoy especialmente interesado en la solución que me permite declarar específicamente lo manijas para heredar, y no se heredarán todos los mangos de la ONU-especificado, si existe una solución de este tipo.

Gracias por su amabilidad.

¿Fue útil?

Solución

Si el identificador de archivo de salida es heredado por el proceso hijo, entonces eso es debido a que el código en el proceso padre la abrió el archivo indica explícitamente que el identificador de archivo debe ser heredables. Se pasa un valor para el parámetro lpSecurityAttributes de CreateFile . El estado por defecto es que el mango no ser heredables.

Me parece que la clase de proceso de creación no debe tratar de adivinar su llamador, que ya ha abierto el archivo.

Sin embargo, si usted tiene un conocimiento especial de la exactitud que se ocupa de las nuevas necesidades del proceso, a continuación, a partir de Windows Vista, existe un mecanismo para especificar qué manijas deben ser heredados. Cuando se prepare para CreateProcess llamada, utilice una estructura STARTUPINFOEX en lugar de la habitual STARTUPINFO. Tiene un miembro de lpAttributeList. Asignar y inicializarlo, y luego usar UpdateProcThreadAttribute con PROC_THREAD_ATTRIBUTE_HANDLE_LIST para establecer la lista de asas para ser heredada. Todos los tiradores deben ser heredables, y todavía se necesitan especificar bInheritHandles = true cuando llame CreateProcess. También es necesario incluir en el parámetro EXTENDED_STARTUPINFO_PRESENT dwCreationFlags. Raymond Chen demostró la técnica en un artículo en 2011.

Si esa funcionalidad no está disponible para usted, entonces ciertamente se podría tratar de [enumerar todos los identificadores abiertos de su programa] y ajuste todas sus propiedades de herencia con SetHandleInformation , pero que parece estar más allá del ámbito de una función cuyo trabajo consiste en crear procesos hijos. Deje que el código que crea las asas se preocupe por si deben ser heredables.

Otros consejos

Puede utilizar SetHandleInformation a clara el bit HANDLE_FLAG_INHERIT en su mango de salida, esto evitará que el proceso hijo de heredarlo.

  

Si se establece este indicador, un proceso hijo creado con el parámetro bInheritHandles del conjunto CreateProcess para TRUE heredará el mango objeto.

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