2009-01-13 23 views
5

Necesito crear un nuevo proceso con flujo de error estándar redirigido a algún archivo. El código del proceso secundario que se está creando no tiene ninguna consola disponible, por lo que hay casos en que GetStdHandle (any) devolverá 0. Child Process intentará duplicar todos sus identificadores de IO estándar por alguna razón (el código fuente para el proceso hijo no está disponible)) por lo que todos sus identificadores deberían ser válidos.¿Cómo abrir un archivo "nul"?

por eso es necesario para ejecutar el proceso de la misma manera como se le puede corrió desde la consola con:

someproc <nul >nul 2>err 

veo algunas maneras para esto: 1. Cree dos pares de tubos. Esta es posiblemente una buena solución, pero será demasiado compleja para mí. 2. Abra el archivo "nul" con la llamada de función CreateFile ("nul", ...). No se está creando ningún archivo con esta llamada, pero esto también me parece extraño. 3. Use INVALID_HANDLE_VALUE. Esto también funciona, pero creo que puede haber diferentes problemas con otros procesos secundarios.

Creo que hay mejores formas.

+0

¡Muy bien! Gracias por enumerar las posibilidades. –

Respuesta

6

Como se formuló originalmente, ya ha respondido su propia pregunta. Para abrir un archivo "nul", simplemente especifique "nul" cuando llame al CreateFile. Solo se ve raro porque casi nadie usa ese nombre de archivo. (No creo que se use con tanta frecuencia como veo /dev/null). Sin embargo, es perfectamente válido.

Pero si ha encontrado que Invalid_Handle_Value funciona, también, continúe y utilice eso en su lugar. Sin duda es más fácil. No hubiera esperado que funcionara, inicialmente, ya que no esperaría que sea duplicable.

2

Sí, "nul" hace lo que piensa. Si te mueves a Unix, será "/ dev/null". El nombre moderno es un vestigio de días del DOS, junto con "prn" y "COM1", etc.

1

Usando INVALID_HANDLE_VALUE con DuplicateHandle es inadecuada: la documentación indica que es necesario el acceso PROCESS_DUP_HANDLE derecha en el mango. No tiene ese derecho en INVALID_HANDLE_VALUE. Dispositivo NUL (enlace simbólico a /device/null) funcionará bien, sin embargo.

Cuestiones relacionadas