Kann ich auf die Terminaldatei zugreifen?

Kann ich auf die Terminaldatei zugreifen?

In den 1970er Jahren hatten wir CUI-Hardwareterminals.

Jetzt sehe ich in meiner Linux-Box sieben Terminalemulatoren, wobei die GUI den siebten Terminalemulator belegt (Strg+Alt+F7).

Dies ist beispielsweise mein erster Terminalemulator (Strg+Alt+F1)

$ tty
/dev/tty0

Beim >catDrücken der Eingabetaste im Benutzerbereich catwartet der Prozess darauf, stdinEingaben aus /dev/tty0der Datei zu erhalten. Ich konnte /dev/tty0die Datei mit keinem Editor anzeigen.

Sowohl der stdinals auch stdoutder catProzess arbeiten mit /dev/tty0der Datei.

Frage:

Ist diese Terminaldatei mithilfe eines Editors /dev/tty0im Benutzerbereich zugänglich?

Antwort1

Sie greifen ständig auf die Terminaldatei zu. Dies führt jedoch nicht zu dem, was Sie wahrscheinlich denken.

Wenn Sie in eine Datei auf der Festplatte schreiben und später daraus lesen, ist das, was Sie lesen, das, was Sie geschrieben haben. Dies ist bei speziellen Dateien wie Terminals nicht der Fall. Eine Datei ist etwas, in das geschrieben und aus dem gelesen werden kann¹; die Verbindung zwischen dem, was geschrieben und dem, was gelesen wird, hängt von der Art der Datei ab. Bei einer Zeichengerätedatei gibt es normalerweise überhaupt keine Verbindung.

Terminaldateien verbinden zwei Entitäten, die unterschiedliche Rollen spielen: das Terminal selbst und eine Anwendung, die mit einem Benutzer interagieren möchte. Das Terminal kann entweder ein Stück Hardware sein, das durch den Kernel dargestellt wird, oder ein Terminalemulator, der ein Prozess ist. Wenn die Anwendung Daten schreibt, kann das Terminal sie lesen (und zeigt sie dem Benutzer normalerweise auf irgendeine Weise an); wenn die Anwendung Daten liest, kommen die Daten vom Terminal (normalerweise handelt es sich dabei um Eingaben des Benutzers).

In Ihrem Fall ist die Anwendung nacheinander die Shell, Cat, der Editor usw. Der Editor versucht möglicherweise, vom Terminal zu lesen, wartet dabei jedoch auf Ihre Eingabe und reagiert möglicherweise nicht richtig auf das Ende der Eingabe (was Sie durch Drücken von Strg+D am Anfang einer Zeile signalisieren würden). Auch hier erhalten Sie beim Lesen vom Terminal keine Ergebnisse, dieAusgabezum Terminal.

Bei einer Konsole werden Daten, die auf das Terminal geschrieben werden, auf dem Bildschirm dargestellt. Bei Linux-Konsolen /dev/tty1kann der angezeigte Text vom Gerät zurückgelesen werden/dev/vcs1so lange es anzeigbar bleibt (Sie erhalten also nur das, was auf dem Bildschirm angezeigt wird und was durch Zurückscrollen noch verfügbar ist; alles, was durch Zurückscrollen nicht erreichbar ist, geht für immer verloren).

Beachten Sie, dass dies eine Funktion ist, die von der Linux-Terminalschnittstelle angeboten wird. Ein Terminal könnte einfach die Pixel zeichnen und den Text vergessen. Die meisten Terminalemulatoren bieten keine ähnliche Funktion.

¹ Tatsächlich sind die meisten Dateien so, aber nicht alle. Verzeichnisse können über die normale Schnittstelle nicht geschrieben werden und auf vielen Unix-Varianten auch nicht gelesen werden. Einige Geräte unterstützen weder Lesen noch Schreiben, sondern nur ioctl.

Antwort2

Ja, allerdings ist die Terminaldatei keine normale Datei.

Wenn Sie die erweiterten Eigenschaften einer Terminaldatei auflisten, sehen Sie:

$ ls /dev/tty1 -lah
crw--w---- 1 root tty 4, 0 Apr  6 13:07 /dev/tty1

Beachten Sie, dass das erste Zeichen im Berechtigungsabschnitt ein Buchstabe „c“ ist. Dies zeigt an, dass die Datei ein spezielles Zeichengerät ist. Im Gegensatz dazu hätte eine normale Datei dort ein „-“, ein Verzeichnis ein „d“, ein spezielles Blockgerät ein „b“, ein symbolischer Link ein „l“ und ein Unix-Domain-Socket ein „s“.

Es ist wichtig zu beachten, dass in Unix-Systemen wie Linux ein Dateisystem eigentlich eher ein Namespace für Interaktionen mit Kernelobjekten ist, in dem Sie verschiedene Kernelobjekte benennen können, damit sie von verschiedenen Teilen des Systems eindeutig referenziert werden können. Diese Kernelobjekte sind nicht nur normale Dateien, die durch einen dauerhaften Speicher unterstützt werden, sondern auch Dinge wie Hardwaregeräte oder Sockets usw.

Ein spezielles Zeichengerät ist ein Kernelobjekt, das mit dem Benutzerbereich interagiert, indem es Zeichenströme liest und schreibt. Der Zugriff erfolgt überread()Undwrite()Systemaufruf.

Auf meinem Computer beispielsweise kann ich mit Strg+Alt+F1 (was bei meinem Computer /dev/tty1 und nicht tty0 ist) alles, was in die virtuelle Konsole eingegeben wird, mit einem Programm auslesen, das den read()Systemaufruf wie folgt verwendet cat:

  1. Im grafischen Emulatorsudo cat /dev/tty1
  2. Wechseln Sie mit Strg+Alt+F1 zum virtuellen Konsolenemulator
  3. Geben Sie etwas in den virtuellen Konsolenemulator ein
  4. Wechseln Sie mit Strg+Alt+F7 zurück zur grafischen Benutzeroberfläche
  5. Im grafischen Emulator würde ich alles, was ich in den virtuellen Konsolenemulator eingetippt habe, als Ausgabe von sehencat

Umgekehrt könnte ich die Zeichen auch in der virtuellen Konsole anzeigen, indem ich ein Programm verwende, das write()einen Systemaufruf wie diesen verwendet tee:

  1. Im grafischen Emulatorecho "hello world" | sudo tee /dev/tty1
  2. Wechseln Sie mit Strg+Alt+F1 zum virtuellen Konsolenemulator
  3. Im virtuellen Konsolenemulator würde ich "Hallo Welt" sehen

Die meisten normalen Texteditoren weigern sich, nicht normale Spezialdateien zu öffnen, da sie so programmiert sind, dass sie den Dateityp prüfen und die Bearbeitung nicht normaler Dateien verweigern. Dies soll „Unfälle“ verhindern, da es wenig Sinn ergibt, Spezialgeräte in normalen Texteditoren zu bearbeiten. Darüber hinaus rufen die meisten normalen Texteditoren nicht einfach write()die vorhandene Datei auf, sondern schreiben in eine neue Datei und rename()die Auslagerungsdatei, um die alte Datei zu ersetzen. Selbst wenn Sie einen Texteditor haben, der das Schreiben an Ort und Stelle unterstützt, versucht dieser normalerweise, die Datei zuerst zu kürzen, was natürlich in einem Spezialzeichengerät nicht unterstützt wird.

Antwort3

In den 1970er Jahren hatten wir CUI-Hardwareterminals.

In den 70er Jahren verwendete jedoch niemand den Begriff CUI.

Jetzt sehe ich in meiner Linux-Box sieben Terminalemulatoren, wobei die GUI den siebten Terminalemulator belegt (Strg+Alt+F7).

Diese Terminalemulatoren gab es bereits in den 80er Jahren und es gab keine GUI.

Ist diese Terminaldatei /dev/tty0 mithilfe eines Editors im Benutzerbereich zugänglich?

Diese Frage ergibt keinen Sinn. Alle Dateien sind konzeptgemäß im Benutzerbereich zugänglich, das ist der Sinn von Dateien, insbesondere von Dateien in /dev. /dev/tty0Da es sich um ein Gerät handelt, kann es nicht bearbeitet werden, da sein „Inhalt“ im Wesentlichen flüchtig ist. Was Sie daraus lesen, ist das, was Sie letztendlich in die Konsole eingeben, und was Sie darauf schreiben, wird auf dem Bildschirm angezeigt.

Antwort4

Ja, Sie können auf jeden TTY als Datei zugreifen, wie auf jedes Gerät in Unix. Ich würde diese Frage als potenziell doppelt markieren, daDasDie Antwort erklärt gut, wie Ihre Frage in einer ähnlichen Situation zu erledigen ist.

Um diese Antwort zusammenzufassen: Sie können mit anderen TTYs über echo und cat genauso interagieren wie mit jeder anderen Datei. Der Grund, warum Sie beim Öffnen der Datei nichts gesehen haben, liegt darin, dass wie bei vielen Spezialdateien nur neue Daten verfügbar sind.

verwandte Informationen