Forum: PC-Programmierung Feststellen ob stdout in eine Pipe geht


von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

Servus,

ich versuche herauszubekommen wie ich in einem Kommandozeilenprogramm
feststellen kann ob die Konsolenausgabe in eine Datei läuft:

zB Programm.exe >ausgabe.txt

getcmd() liefert mir nur den Ausruf bis zum '>'.

Warcon C 1.9
Win 10

Ich weiß noch nicht mal was ich Google da fragen könnte ;)

Grüße Joe

von leo (Gast)


Lesenswert?

Joachim D. schrieb:
> Ich weiß noch nicht mal was ich Google da fragen könnte ;)

Stichwort "redirection":

_isatty() bzw. isatty()

leo

von Imonbln (Gast)


Lesenswert?

Der Posix Standard sieht hierfür die Funktion istty. Microsoft kennt die 
auch siehe Hier (wo auch gleich dein Fall als Beispiel erklärt wird)

https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/isatty?view=vs-2019

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

isatty( 1) (für stdout) ergibt 0 oder 1.
Das hatte ich gesucht, Vielen Dank :)

von Imonbln (Gast)


Lesenswert?

Joachim D. schrieb:
> isatty( 1) (für stdout)
1
isatty( fileno(stdout ) )

Wäre durch den POSIX und C Standard abgedeckt und daher der Annahme das 
stdout den Filedescriptor 1 hat vorzuziehen. Auch wenn ich zugeben muss 
das es de facto immer so ist, dass die Annahme 1 == stdout zutrifft.

von Ralf D. (doeblitz)


Lesenswert?

Imonbln schrieb:
> Joachim D. schrieb:
>> isatty( 1) (für stdout)
>
>
1
> isatty( fileno(stdout ) )
2
>
>
> Wäre durch den POSIX und C Standard abgedeckt und daher der Annahme das
> stdout den Filedescriptor 1 hat vorzuziehen. Auch wenn ich zugeben muss
> das es de facto immer so ist, dass die Annahme 1 == stdout zutrifft.

Nicht nur de facto, sondern auch de jure. ;-)
https://pubs.opengroup.org/onlinepubs/9699919799/functions/stdout.html

Die FDs 0, 1 und 2 sind laut POSIX fix auf stdin, stdout und stderr 
festgelegt. Aber Verwendung der Konstanten ist natürlich trotzdem der 
sauberere Weg.

von Rolf M. (rmagnus)


Lesenswert?

Ralf D. schrieb:
> Aber Verwendung der Konstanten ist natürlich trotzdem der sauberere Weg.

Du meinst Verwendung der Funktion. (also fileno()).

von Ralf D. (doeblitz)


Lesenswert?

Rolf M. schrieb:
> Ralf D. schrieb:
>> Aber Verwendung der Konstanten ist natürlich trotzdem der sauberere Weg.
>
> Du meinst Verwendung der Funktion. (also fileno()).

Nein, die Konstanten. Die Filenos der Standard-Deskriptoren sind 
Konstanten:
  STDIN_FILENO, STDOUT_FILENO, STDERR_FILENO

Da braucht man keine Funktionsaufrufe, die eh nichts anderes 
zurückliefern können/dürfen. Ausser natürlich man möchte da Assertions 
ergänzen ...

von Rolf M. (rmagnus)


Lesenswert?

Ralf D. schrieb:
> Nein, die Konstanten. Die Filenos der Standard-Deskriptoren sind
> Konstanten:
>   STDIN_FILENO, STDOUT_FILENO, STDERR_FILENO

Ach die meintest du. Ich hab in solchen Fällen bisher immer einfach 0, 1 
und 2 verwendet, aber du hast schon recht. Sprechende Bezeichner sind 
besser.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.