Al crear un proceso secundario en C++ mediante la API de Windows, uno puede permitir la herencia de identificadores de principal a secundario. En un ejemplo de Microsoft "Creating a Child Process with Redirected Input and Output", al redirigir un proceso hijo 'std in/out a las tuberías creadas por el padre, es necesario permitir que la herencia de las tuberías de redirección sea utilizable.Seleccione qué identificadores se heredan mediante el proceso secundario
Estoy trabajando en una pequeña clase de demostración que lanza un ejecutable externo, lee el resultado y luego lo escupe nuevamente a la persona que llama (quien graba la salida devuelta en un archivo). Estoy intentando crear una característica de tiempo de espera, donde solo se bloqueará durante un cierto período de tiempo antes de llamar al TerminateProcess()
en el niño y continuar con la vida.
Sin embargo, he encontrado que al permitir la herencia de identificador, el proceso secundario también tiene un identificador (visible con Process Explorer) en el archivo de salida. No quiero que el proceso hijo obtenga este identificador, pero el padre en este caso (esta clase de demostración) tampoco conoce el identificador, por lo que actualmente no puedo usar SetHandleInformation()
para desmarcar el archivo de salida específicamente para excluirlo de la herencia.
Estoy seguro de que debe haber una mejor manera de heredar SOLAMENTE los identificadores específicos que quiero, sin permitir la herencia "general" que pase los identificadores no deseados y no deseados. Lamentablemente, no he podido encontrar una solución, ya que he navegado tantos artículos relacionados con MSDN como puedo encontrar y me he desanimado a través de Google.
Por lo menos, necesito algo para quitar los controladores del elemento secundario, sin tener necesariamente esos controladores dentro de la clase de demostración (son utilizados por la clase llamante, y esta clase de demostración no tiene explícita conocimiento de su existencia).
¿Alguna solución para una herencia más selectiva? Estoy especialmente interesado en la solución que me permite declarar específicamente qué identificadores heredar, y todos los identificadores no especificados no se heredarán, si existe tal solución.
Gracias amablemente.
Si bien el sentimiento de no adivinar la intención del propietario original es ciertamente razonable para transmitir, en este caso particular, estoy familiarizado con el funcionamiento de la persona que llama. El archivo es en realidad un 'ofstream' abierto bastante genéricamente con un" streamName.open ("filename"); " Aunque esto parece indicar que el comportamiento predeterminado para esta llamada estándar es crear un identificador heredable, todavía tengo la sensación de que debería ser posible definir explícitamente qué identificadores deben heredarse al crear un proceso secundario. Todavía espero que esto sea posible y que alguien sepa cómo hacerlo. – KevenK
(continua desde arriba). Me quedé sin espacio, pero también quería agradecerle por compartir su tiempo y conocimiento sobre el tema. Ciertamente aprecio la sabiduría al permitir que el creador determine la heredabilidad de un identificador si deseaban compartirlo específicamente. No estoy en desacuerdo con el sentimiento, solo que sé que en este caso este es un resultado no deseado. Quiero creer que hay un "valor predeterminado ninguno hasta que se especifique" para contrarrestar la configuración actual "predeterminado a menos que se especifique". ¡Deseo de pensar de mi parte, quizás! Pero gracias amablemente por su tiempo y sabiduría. – KevenK
Las únicas opciones que tiene al crear un proceso son hacer que el proceso herede todo lo que ya se ha establecido como heredable o no heredar nada. Dentro de esa regla, necesitará encontrar los identificadores y establecer su heredabilidad después. Si la secuencia de archivos no está creando el archivo con las propiedades que desea, llame a 'CreateFile' usted mismo, y luego envuelva el manejador usando' _open_osfhandle' y * fdstream.hpp *, o las clases Boost.Iostreams 'file_descriptor' y 'stream'. –