2010-01-18 1 views
9

Ho un'applicazione Win32 scritta in C che può avere l'output della console tramite printf() reindirizzato a un file di registro.Come si rileva quando l'output viene reindirizzato?

Sarebbe bello se potessi avere la mia app. rilevare se è stato avviato con o senza un reindirizzamento '>'.

Qualche idea?

+2

per quanto ne so, questo non è possibile. Quindi leggerò questo per vedere se ho torto ... –

+0

Non c'è modo di saperlo. Ho visto programmi che consentono un'opzione della riga di comando per fare funzionalità diverse che spesso viene attivata solo quando l'output viene reindirizzato. – Hogan

+1

Non sicuro al 100% in Windows, ma in Linux ci sono molti programmi che si comportano in modo diverso se collegati o meno ... l'esempio più comune è "ls". – fortran

risposta

5

Tom, grazie per l'ingresso.

ho fatto alcuni esperimenti e abbiamo trovato questo funziona per me ..

fpost_t pos ; 

fgetpos (stdout, & pos) ; 

Quando l'uscita di un'applicazione viene reindirizzato a un file, fgetpos() set di 'pos' a zero. Ha senso dal momento che è appena aperto per te. EDIT: In realtà, il valore restituito può essere un numero intero positivo se il testo è già stato reindirizzato al/file di log. Quindi nel tuo codice avresti qualcosa come "if (pos> = 0) bfRedirected = TRUE;"

Quando l'uscita di un'applicazione non viene reindirizzato - è andare al dispositivo di console - non è un file, in modo da fgetpos() imposterà 'pos' a -1.

0

AFAIK la risposta a questo è che non è possibile. Il reindirizzamento dell'output funziona semplicemente leggendo il flusso di output di un determinato programma e reindirizzandolo a un altro pipe/stream. Il design di file/flussi è tale che lo scrittore ignora il lettore al punto che non si dovrebbe sapere che si sta leggendo.

Anche rilevare che c'era un lettore sarebbe inutile perché ce n'è uno nel caso normale. La console sta leggendo l'output del tuo programma e lo sta già visualizzando sullo schermo.

1

Penso che i tubi siano ciechi per natura, quindi non si dispone di un modo integrato per dire se si viene reindirizzati. Inoltre, cercare di scoprire cosa succede dietro uno strato di astrazione è una cattiva abitudine.

Se si ha realmente bisogno per controllare l'output, aggiungere il nome del file di registro come un parametro di riga di comando!

Detto questo, si può fare qualche congettura intelligente per scoprire:

  • Un programma può interrogare la cronologia dei comandi di shell per scoprire i comandi più recenti eseguiti.
  • Se si conosce il percorso dei file di registro, è possibile eseguire la scansione di tale directory e verificare se è stato creato un file o modificato le sue dimensioni.
  • Benchmark velocità di scrittura quando reindirizzato e non reindirizzato. Funzionerebbe solo se il tuo sistema è estremamente stabile e le condizioni ambientali non cambieranno.
2

Potrebbe esserci un modo per farlo: un rapido google ha prodotto questo hit che potrebbe darti il ​​suggerimento nella giusta direzione.

+0

+1 Bella risposta. L'hai provato? –

+0

@Adam: In realtà, questo mi ha sorpreso, quindi no, non l'ho provato. Neanche pensavo fosse possibile! :) – t0mm13b

+1

FYI, quel collegamento a codegear è morto, e non compare nemmeno nella macchina Wayback. –