es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo NO heredar stdin, stdout y stderr en CreateProcess() en Windows.

CreateProcessW() acepta una bandera bInheritHandles. Si se establece en FALSE, solo stdin, stdout y stderr se heredan, los demás no lo son.

A veces resulta molesto heredar todo, así que es posible configurar explícitamente los handles que se heredarán utilizando la información de inicio extendida. En ese caso, stdin, stdout y stderr no se heredan por defecto, pero se pueden heredar incluyéndolos en los handles heredables en UpdateProcThreadAttribute().

De esta forma, es posible heredar solo stderr, por ejemplo.

¿Pero cómo desactivarlos todos (incluyendo stdin, stdout y stderr) de forma específica? UpdateProcThreadAttribute() falla si le pasamos una lista vacía o NULL como atributo para PROC_THREAD_ATTRIBUTE_HANDLE_LIST.

Es importante tener en cuenta que no se desea redirigir stdin, stdout y stderr en este caso (no se quiere escribir en/leer de ellos), solo se quieren desactivar.

Como solución alternativa, es posible crear un HANDLE ficticio y heredado, para que stdin, stdout y stderr puedan desactivarse, aunque es un poco forzado. Establecer bInheritHandles en FALSE no funciona porque habilita stdin, stdout y stderr. ¿Podría pasar DETACHED_PROCESS tener otros efectos secundarios (?)?

¿Cuál es la forma correcta de lograr esto?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para deshabilitar todas las manipulaciones, incluyendo stdin, stdout, y stderr, el método recomendado es crear una nueva consola con la marca CREATE_NEW_CONSOLE y adjuntar el proceso a ella usando AttachConsole() con la marca ATTACH_PARENT_PROCESS. Esto desconectará efectivamente el proceso de la consola original y prevenirá cualquier entrada o salida a través de stdin, stdout, y stderr.

    Si no se desea crear una nueva consola, una solución alternativa es crear una HANDLE ficticia y heredarla junto con PROC_THREAD_ATTRIBUTE_HANDLE_LIST. Esto permitirá deshabilitar stdin, stdout, y stderr sin redireccionarlos. Sin embargo, esto se considera una solución poco elegante y puede no ser confiable en todos los casos.

Comments are closed.