Was ist in /dev/pts-Dateien gespeichert und können wir sie öffnen?

Was ist in /dev/pts-Dateien gespeichert und können wir sie öffnen?

Meines Wissens /dev/ptswerden Dateien für SSH- oder Telnet-Sitzungen erstellt.

Antwort1

Darin wird nichts gespeichert /dev/pts. Dieses Dateisystem existiert ausschließlich im Speicher.

Einträge in /dev/ptssindPseudoterminals(kurz pty). Unix-Kernel haben eine generische Vorstellung vonKlemmenEin Terminal bietet Anwendungen die Möglichkeit, Ausgaben anzuzeigen und Eingaben über einEndgerätEin Prozess kann eineSteuerterminal— Dies ist die Art und Weise, wie eine Anwendung im Textmodus mit dem Benutzer interagiert.

Terminals können entweder Hardwareterminals („tty“, kurz für „Teletype“) oder Pseudoterminals („pty“) sein. Hardwareterminals werden über eine Schnittstelle wie einen seriellen Port ( ttyS0, …) oder USB ( ttyUSB0, …) oder über einen PC-Bildschirm und eine Tastatur ( tty1, …) angeschlossen. Pseudoterminals werden von einem Terminalemulator bereitgestellt, bei dem es sich um eine Anwendung handelt. Einige Arten von Pseudoterminals sind:

  • GUI-Anwendungen wie xterm, gnome-terminal, konsole usw. wandeln Tastatur- und Mausereignisse in Texteingaben um und zeigen die Ausgabe grafisch in einer bestimmten Schriftart an.
  • Multiplexer-Anwendungen wie Screen und TMUX leiten Ein- und Ausgaben von und zu einem anderen Terminal weiter, um Textmodus-Anwendungen vom eigentlichen Terminal zu entkoppeln.
  • Remote-Shell-Anwendungen wie SSHD, Telnetd, Rlogind usw. leiten Eingabe und Ausgabe zwischen einem Remote-Terminal auf dem Client und einem PTY auf dem Server weiter.

Wenn ein Programm ein Terminal zum Schreiben öffnet, erscheint die Ausgabe dieses Programms auf dem Terminal. Es ist üblich, dass mehrere Programme gleichzeitig auf einem Terminal ausgeben, obwohl dies manchmal verwirrend sein kann, da es keine Möglichkeit gibt, zu erkennen, welcher Teil der Ausgabe von welchem ​​Programm stammt. Hintergrundprozesse, die versuchen, auf ihr steuerndes Terminal zu schreiben, könnenautomatisch durch ein SIGTTOU-Signal angehalten.

Wenn ein Programm ein Terminal zum Lesen öffnet, wird die Eingabe des Benutzers an dieses Programm weitergeleitet. Wenn mehrere Programme vom selben Terminal lesen, wird jedes Zeichen unabhängig an eines der Programme weitergeleitet; dies wird nicht empfohlen. Normalerweise liest zu einem bestimmten Zeitpunkt nur ein einziges Programm aktiv vom Terminal; Programme, die versuchen, von ihrem steuernden Terminal zu lesen, während sie sich nicht im Terminal befinden,VordergrundSindautomatisch durch ein SIGTTIN-Signal unterbrochen.

Um zu experimentieren, führen Sie ttyin einem Terminal aus, um zu sehen, welches Terminalgerät es ist. Nehmen wir an, es ist /dev/pts/42. Führen Sie in einer Shell in einem anderen Terminal aus echo hello >/dev/pts/42: Die Zeichenfolge hellowird auf dem anderen Terminal angezeigt. Führen Sie nun aus cat /dev/pts/42und geben Sie im anderen Terminal ein. Um diesen catBefehl abzubrechen (der die Verwendung des anderen Terminals erschwert), drücken Sie Ctrl+ C.

Das Schreiben auf ein anderes Terminal ist gelegentlich nützlich, um eine Benachrichtigung anzuzeigen; zum Beispiel diewriteDer Befehl macht das. Das Lesen von einem anderen Terminal erfolgt normalerweise nicht.

Antwort2

Die Dateien darin /dev/ptssind „Pseudo-TTYs“. Sie sind bis zu einem gewissen Grad wie benannte Pipes, aber sie imitieren auch alte serielle Anschlussterminals wie VT-100s. Pseudo-TTYs übernehmen die Aufgabe, Bytes von der Tastatur zum Programm und vom Programm zum Ausgabegerät zu übertragen, was einfach klingt. Aber das beantwortet Ihre Frage explizit: Der Kernel speichert /dev/pts/0beispielsweise nichts darin. Nur Byteströme von stdout eines mit dem Pseudo-TTY verbundenen Programms gehen hinein, und Programme, deren stdin mit demselben Pseudo-TTY verbunden ist, lesen diese Bytes.

Pseudo-TTYs fügen diesen Byte-Streams außerdem eine Indirektionsebene hinzu. Der Kernel kann Bytes auf spezielle Werte wie „Control-C“ oder „Control-D“ oder „Control-U“ (die alle konfigurierbar sind, siehe man stty) prüfen und ein SIGINT senden, das Dateiende auf stdin setzen oder eine Zeile in der Eingabe löschen. Irgendwo gibt es da auch eine Pufferfunktion, daher ist mein „speichert nichts“ etwas falsch, aber nur um ein paar Kilobyte.

Der Kernel kann Bytewerte in der Ausgabe prüfen und Dinge tun wie einen Zeilenumbruch (ASCII-Zeilenvorschub, LF oder "\n") in zwei Bytes umwandeln, einen Wagenrücklauf und Zeilenvorschub (CRLF oder "\r\n") oder was auch immer die Hardware eines seriellen Terminals an Bytes benötigt. Die Indirektion eines Pseudo-TTY ermöglicht Unabhängigkeit von der Hardware.

Pseudo-TTYs erlauben auch alle Systemaufrufe „Baudrate festlegen“, „Parität festlegen“ usw. ioctl()und tun wahrscheinlich nichts damit. Dadurch können Programme, die zu Zeiten von VT-100s, ADM-3 und Wyse oder was auch immer geschrieben wurden, weiterhin ohne Fehler funktionieren. Software, der Gerätetreiber der Pseudo-TTYs, verhält sich wie Hardware.

Pseudo-TTYs können von sshdund verwendet werden telnet, sie werden jedoch auch zwischen einem Terminalemulator (wie xtermoder rxvt) und der Shell verwendet, die normalerweise innerhalb von xterm ausgeführt wird.

Linux und viele Unix-Versionen haben Pseudo-TTYs. Plan 9 nicht. Pseudo-TTYs sind ein kleines Relikt aus der Zeit der per seriellem Kabel angeschlossenen Hardwareterminals.

Antwort3

/dev/ist ein spezielles Verzeichnis für Gerätedateien. Dies sind Abstraktionen, keine echten Dateien auf der Festplatte. Das Verzeichnis wird beim Booten gefüllt und kann geändert werden, um vorhandene Geräteschnittstellen widerzuspiegeln, die vom Kernel und einem Userspace-Daemon erstellt und zerstört werden udevd.

Viele der so dargestellten Geräte sind virtuell. Dazu gehören die Einträge in /dev/pts, bei denen es sich um Konsolengeräte handelt. Aus diesem Grund wird eines für Remotesitzungen erstellt; sie werden auch erstellt, wenn Sie ein lokales GUI-Terminal öffnen.

Sie können sie als Dateien öffnen, obwohl das nicht viel nützt. Um den /dev/ptsKnoten abzurufen, mit dem Ihre Shell verbunden ist, verwenden Sie tty:

> tty
/dev/pts/4

Wechseln Sie jetzt zu einer anderen Konsole und versuchen Sie:

> echo "duck!" > /dev/pts/4

Clever. Versuchen Sie jetzt:

> cat /dev/pts/4

Versuchen Sie dann, die Shell unter /dev/pts/4 zu verwenden. Sie bleiben hängen, bis Sie sie catauf der anderen Seite verlassen, aber das meiste, was Sie unter pts/4 eingeben, wird durchgelassen (z. B. landete ich bei „Hallo Welt“ hlunter pts/4 und ello wordauf der catKonsole).

Ich vermute, dass das Gerät Eingaben von der Shell entgegennimmt und diese über das System ausgibt, und so landet das Zeug auf dem Bildschirm – die Shell beschäftigt sich nicht mit der Hardware, sondern das System. Probieren Sie es aus strace bash(und schauen Sie es sich an, man stracewenn Sie nicht wissen, was es ist); Sie erhalten eine vorläufige Flut von Aufrufen, wenn Bash startet. Beginnen Sie nun damit, Tasten zu drücken:

read(0, "h", 1)                         = 1
rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0
write(2, "h", 1h)                        = 1
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0
read(0, "e", 1)                         = 1
rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0
write(2, "e", 1e)                        = 1
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0
read(0, "y", 1)                         = 1
rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0
write(2, "y", 1y)                        = 1
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0

Für jeden eingegebenen Buchstaben wird von der Standardeingabe gelesen und in die Standardausgabe geschrieben. Aber womit ist die Standardausgabe der Shell verbunden? Versuchen Sie es jetzt straceauf Ihrem GUI-Terminal – Sie müssen den Namen herausfinden, wenn Sie ihn nicht kennen, unter KDE lautet er beispielsweise konsole, und GNOME hat gnome-terminal, glaube ich, das . Die Ausgabe davon straceist vermutlich kryptischer – meine hat viele poll()und recvfrom(). Ich sehe keine Schreibvorgänge, aber wenn Sie den catTrick jetzt von einem anderen Terminal aus anwenden, werden Sie beim Tippen feststellen, dass die Tastenanschläge, die von cat gelesen werden, überhaupt keine Reaktion in der strace-Ausgabe verursachen – das Terminal empfängt sie nicht. Die GUI-Terminal-App und cat konkurrieren also darum, vom selben Gerät zu lesen, auf das die Shell ausgibt.

verwandte Informationen