[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: