
Bei einer Shell in Linux (zum Beispiel: bash
) verweisen die Dateideskriptoren stdin
und stdout
und stderr
alle auf die gleiche Gerätedatei. Im Folgenden sind beispielsweise die Dateideskriptoren stdin
und stdout
und für aufgeführt :stderr
bash
Nun /dev/tty1
handelt es sich nicht um eine „echte“ Datei, aus der Sie lesen und in die Sie schreiben können, sondern um eine Gerätedatei, die auf eine Datei oder einen Puffer im Speicher oder etwas anderes verweist.
Meine Frage ist nun: /dev/tty1
Zeigt es nur auf eine Datei oder auf zwei Dateien?
Was ich meine ist, wenn bash
von /dev/tty1
( stdin
) gelesen wird und wenn bash
in /dev/tty1
( stdout
oder stderr
) geschrieben wird, wird dann von dem gelesen und in den geschriebengleiche Datei, oder zeigt /dev/tty1
auf zwei Dateien, von denen eine beim Lesen aus /dev/tty1
und die andere beim Schreiben in verwendet wird /dev/tty1
?
Antwort1
Ein Geräteknoten zeigt auf ein einzelnesGerät, das unter Linux vom Kernel verwaltet wird. Wenn bash
von gelesen wird /dev/tty1
, liest es vom Gerätetreiber, der das erste Terminal verwaltet; wenn es dorthin schreibt, schreibt es in denselben Gerätetreiber.
Antwort2
Eine Gerätedatei „zeigt nicht auf mehrere Dateien“. Eine Gerätedatei „zeigt“ nicht einmal auf eine einzelne Datei. Eine Gerätedatei zeigt auf einen Treiber. Der Treiber enthält Code, der Lese- und Schreibvorgänge verarbeitet.
Es muss keine Beziehung zwischen den vom Gerät gelesenen und den geschriebenen Daten bestehen. Manche Geräte haben eine, andere nicht. Bei einer Festplatte sind beispielsweise die an einer bestimmten Position gelesenen Daten die Daten, die zuvor an diese Position geschrieben wurden. Bei einem seriellen Anschluss hingegen werden die an das Gerät geschriebenen Daten über die serielle Leitung gesendet und die vom Gerät gelesenen Daten über die serielle Leitung empfangen; was gesendet wird, ist unabhängig von dem, was empfangen wird.
Ein Terminal ist einem seriellen Gerät sehr ähnlich. Tatsächlich wurden physische Terminals früher normalerweise über serielle Leitungen verbunden. Wenn eine Anwendung aus einer Terminaldatei liest, empfängt sie Daten, die vom Terminaltreiber oder Terminalemulator gesendet wurden – der Terminaltreiber/Emulator schreibt Eingaben auf seine Seite des Terminals, die Anwendung liest Eingaben von ihrer Seite des Terminals. Wenn eine Anwendung in eine Terminaldatei schreibt, sendet sie Daten, die dann vom Terminaltreiber oder Terminalemulator gelesen werden – die Anwendung schreibt Ausgaben auf ihre Seite des Terminals, der Terminaltreiber/Emulator liest Ausgaben auf seiner Seite des Terminals.