2010-01-18 11 views
9

Tengo una aplicación Win32 escrita en C que puede tener su salida de consola a través de printf() redirigido a un archivo de registro.¿Cómo puedo detectar cuándo se está redireccionando la salida?

Sería bueno si pudiera tener mi aplicación. detectar si se ha iniciado con o sin un redireccionamiento '>'.

¿Alguna idea?

+2

AFAIK, esto no es posible. Así que leeré esto para ver si estoy equivocado ... –

+0

No hay forma de saberlo. He visto programas que permiten que una opción de línea de comando realice diferentes funciones, que a menudo solo se activan cuando se redirige la salida. – Hogan

+1

No es 100% seguro en Windows, pero en Linux hay muchos programas que se comportan de manera diferente si se canalizan o no ... el ejemplo más común es "ls". – fortran

Respuesta

5

Tom, gracias por la entrada.

hice algunos experimentos y encontró que esto funciona para mí ..

fpost_t pos ; 

fgetpos (stdout, & pos) ; 

Cuando la salida de una aplicación está siendo redirigido a un archivo, fgetpos() conjuntos 'pos' a cero. Tiene sentido ya que su stderr recién abierto para ti. EDITAR: En realidad, el valor devuelto puede ser un entero positivo si el texto ya ha sido redirigido al registro/archivo. Entonces en su código tendría algo como "if (pos> = 0) bfRedirected = TRUE;"

Cuando la salida de una aplicación no se redirecciona, va al dispositivo de consola, no a un archivo, por lo que fgetpos() establecerá 'pos' en -1.

0

AFAIK la respuesta a esto es que no se puede. La redirección de salida funciona simplemente leyendo la secuencia de salida de un programa dado y redirigiéndola a otra tubería/secuencia. El diseño de los archivos/secuencias es tal que el escritor ignora al lector hasta el punto de que no debe saber que lo están leyendo.

Incluso detectar que había un lector no serviría de nada porque hay uno en el caso normal. La consola está leyendo la salida de su programa y mostrándola en la pantalla ya.

1

Creo que las tuberías son ciegas por naturaleza, por lo que no tiene una forma integrada para saber si se le redirige. Además, tratar de descubrir qué sucede detrás de una capa de abstracción es un mal hábito.

Si realmente necesita controlar su salida, agregue el nombre del archivo de registro como un parámetro de línea de comando.

Dicho esto, usted puede hacer algunas conjeturas inteligentes para averiguar:

  • Un programa puede consultar el historial de comandos shell para averiguar los comandos más recientes ejecutados.
  • Si conoce la ruta a los archivos de registro, puede escanear ese directorio y ver si se ha creado un archivo o si ha cambiado su tamaño.
  • Velocidad de escritura de referencia cuando se redirige y no se redirige. Esto funcionaría solo si su sistema es ultra estable, y la condición del entorno no cambiará.
2

Puede haber una manera de hacer esto - Google rápido produjo este hit que podría darle la pista en la dirección correcta.

+0

+1 Buena respuesta. ¿Lo has probado? –

+0

@Adam: En realidad, eso me sorprendió, así que no, no lo he intentado. ¡No pensé que fuera posible tampoco! :) – t0mm13b

+1

FYI, ese enlace a codegear está muerto, y tampoco aparece en la máquina Wayback. –

Cuestiones relacionadas