Re: Standard-Fehlerausgabe pipen
Hallo,
Martin Steigerwald wrote:
> Ich dachte ein tty ist ein Terminal und zwar eigentlich nur eines auf
> einer "echten" Console, da die in KDE Konsole ja als pts gehandhabt
> werden. Eine Datei ist doch ebensowenig ein tty wie /dev/null oder gibts
> da noch einen diffiziellen Unterschied?
Irgendwie interessiert mich das jetzt auch :-) So weit ich weiß (ich
lasse mich aber sehr gerne korrigieren), zählt ein pts auch als tty. Ein
kurzer Test:
wolf@denkbrett:/tmp $ cat test.c
#include <stdio.h>
#include <unistd.h>
int main(){
if (!isatty(STDERR_FILENO))
printf("stderr is not a tty\n");
else
printf("stderr is a tty\n");
printf("test\n");
}
wolf@denkbrett:/tmp $ ./test
stderr is a tty
test
wolf@denkbrett:/tmp $ ./test 2>/dev/null
stderr is not a tty
test
Bei diesem Minimalbeispiel kann man auch das gleiche wie bei
dem 'strace free' beobachten (auf den relevanten Teil gekürzt):
wolf@denkbrett:/tmp $ strace ./test
write(1, "stderr is a tty\n", 16stderr is a tty
) = 16
write(1, "test\n", 5test
) = 5
wolf@denkbrett:/tmp $ strace ./test 2>&1 >/dev/null
ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, 0xbfc8be14) = -1 ENOTTY (Inappropriate ioctl for device)
write(1, "stderr is a tty\ntest\n", 21) = 21
Hier wird's jetzt wackelig :-) Ich kann mir gut vorstellen, dass es in
der libc (die ja letztendlich die printf()-Aufrufe aus 'free' und dem
obigen Testprogramm in die write()-Aufrufe umsetzt) prüft, wohin
geschrieben werden soll. Wenn es sich um ein Terminal handelt ->
ungepuffert schreiben (= 2x write), ansonst gepuffert schreiben (= 1x
write). So wird die Anzahl der Syscalls reduziert, solange nicht jemand
gerade auf's Terminal guckt, der ja Ausgaben sofort sehen will.
So, gute Nacht,
Wolf
--
Ich halte mich für unersetzlich, andererseits sieht man ja, dass die Friedhöfe
voll sind von Unersetzlichen... (Günther Jauch)
Reply to: