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?
davy.ai
Para deshabilitar todas las manipulaciones, incluyendo
stdin
,stdout
, ystderr
, el método recomendado es crear una nueva consola con la marcaCREATE_NEW_CONSOLE
y adjuntar el proceso a ella usandoAttachConsole()
con la marcaATTACH_PARENT_PROCESS
. Esto desconectará efectivamente el proceso de la consola original y prevenirá cualquier entrada o salida a través destdin
,stdout
, ystderr
.Si no se desea crear una nueva consola, una solución alternativa es crear una
HANDLE
ficticia y heredarla junto conPROC_THREAD_ATTRIBUTE_HANDLE_LIST
. Esto permitirá deshabilitarstdin
,stdout
, ystderr
sin redireccionarlos. Sin embargo, esto se considera una solución poco elegante y puede no ser confiable en todos los casos.