Meines Wissens nach werden /dev/pts
Dateien für SSH- oder Telnet-Sitzungen erstellt.
tty
.
Meines Wissens nach werden /dev/pts
Dateien für SSH- oder Telnet-Sitzungen erstellt.
tty
.
Antworten:
Nichts ist in gespeichert /dev/pts
. Dieses Dateisystem lebt rein im Speicher.
Einträge in /dev/pts
sind Pseudo-Terminals (kurz Pty). Unix-Kernel haben einen allgemeinen Begriff von Terminals . Ein Terminal bietet Anwendungen die Möglichkeit, Ausgaben anzuzeigen und Eingaben über ein Terminalgerät zu empfangen . Ein Prozess kann ein steuerndes Terminal haben - für eine Textmodus-Anwendung interagiert es auf diese Weise mit dem Benutzer.
Terminals können entweder Hardware-Terminals ("tty", kurz für "Teletype") oder Pseudo-Terminals ("pty") sein. Hardware-Terminals werden über eine Schnittstelle wie eine serielle Schnittstelle ( 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:
Wenn ein Programm ein Terminal zum Schreiben öffnet, wird die Ausgabe dieses Programms auf dem Terminal angezeigt. Es ist üblich, dass mehrere Programme gleichzeitig auf einem Terminal ausgegeben werden. Dies kann jedoch manchmal verwirrend sein, da nicht erkennbar ist, welcher Teil der Ausgabe von welchem Programm stammt. Hintergrundprozesse, die versuchen, auf ihr steuerndes Terminal zu schreiben, können durch ein SIGTTOU-Signal automatisch angehalten werden .
Wenn ein Programm ein Terminal zum Lesen öffnet, wird die Eingabe des Benutzers an dieses Programm übergeben. Wenn mehrere Programme von demselben 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 Vordergrund befinden, werden automatisch durch ein SIGTTIN-Signal angehalten .
Führen Sie zum Experimentieren tty
ein Terminal aus, um zu sehen, um welches Terminal es sich handelt. Sagen wir es ist /dev/pts/42
. Führen Sie in einer Shell in einem anderen Terminal Folgendes aus echo hello >/dev/pts/42
: Die Zeichenfolge hello
wird auf dem anderen Terminal angezeigt. Führen Sie nun cat /dev/pts/42
das andere Terminal aus und geben Sie es ein. Um diesen cat
Befehl zu beenden (was die Verwendung des anderen Terminals erschwert), drücken Sie Ctrl+ C.
Das Schreiben an ein anderes Terminal ist gelegentlich nützlich, um eine Benachrichtigung anzuzeigen. Zum Beispiel macht der write
Befehl das. Das Lesen von einem anderen Terminal wird normalerweise nicht durchgeführt.
strace
das Programm lesen, aber das ist es.
tostop
tty-Flag gesetzt ist. Dieses Flag ist standardmäßig nicht gesetzt. Und ich stehe auf das Lesen von einem anderen TTY korrigiert. Ich habe es ausprobiert und es funktioniert, aber es wird pro Lesevorgang und nicht pro Zeichen ausgeführt (wenn Sie an einer Shell-Eingabeaufforderung sitzen, sind sie mit den Shells identisch, die jeweils 1 Zeichen lesen). Es könnte gut sein, diesen Punkt zu klären, da ich Ihre Antwort jetzt so interpretiert habe.
read
Aufruf gibt nur aufeinanderfolgende Zeichen zurück (oder eher Bytes, sollte ich sagen), aber die Anwendung hat keine Kontrolle darüber, wie viele Bytes ein read
Aufruf zurückgibt, daher ist es nicht besser.
Die Dateien in /dev/pts
sind "pseudo-ttys". Sie ähneln in gewissem Maße Named Pipes, ahmen aber auch alte serielle Anschlussklemmen wie VT-100 nach. Pseudo-ttys übernehmen die Übertragung von Bytes von der Tastatur zum Programm und vom Programm zum Ausgabegerät, was sich einfach anhört. Aber das beantwortet Ihre explizite Frage: Der Kernel speichert /dev/pts/0
zum Beispiel nichts darin . Nur Ströme von Bytes von stdout eines mit der Pseudotty verbundenen Programms gehen ein, und Programme, deren stdin mit derselben Pseudotty verbunden ist, lesen diese Bytes.
Pseudo-ttys fügt diesen Byteströmen auch eine Indirektionsebene hinzu. Der Kernel kann Bytes auf spezielle Werte wie "Control-C" oder "Control-D" oder "Control-U" prüfen (die alle konfigurierbar sind, siehe man stty
) und ein SIGINT senden, das Dateiende auf stdin setzen oder löschen eine Zeile am Eingang. Irgendwo gibt es auch eine Pufferfunktion, so dass mein "nichts speichern" etwas falsch ist, aber nur um ein paar Kilobyte.
Der Kernel kann die Bytewerte bei der Ausgabe überprüfen und beispielsweise eine neue Zeile (ASCII-Zeilenvorschub, LF oder "\n"
) in zwei Bytes, Wagenrücklauf und Zeilenvorschub (CRLF oder "\r\n"
) oder die für eine serielle Terminalhardware erforderlichen Bytes umwandeln . Die Indirektion einer Pseudotty ermöglicht die Unabhängigkeit von Hardware.
Pseudo-ttys erlauben auch alle "eingestellten Baudraten", "eingestellte Parität" usw. ioctl()
Systemaufrufe und tun wahrscheinlich nichts mit ihnen. Auf diese Weise können Programme, die zu Zeiten von VT-100s, ADM-3 und Wyse geschrieben wurden, fehlerfrei weiterarbeiten. Software, der Pseudo-tty-Gerätetreiber, verhält sich wie Hardware.
Pseudo-ttys können von sshd
und verwendet werden telnet
, sie werden jedoch auch zwischen einem Terminal-Emulator (wie xterm
oder rxvt
) und der Shell verwendet, die normalerweise im xterm ausgeführt wird.
Linux und viele Unixe haben Pseudo-tty. Plan 9 geht nicht. Pseudo-ttys sind ein kleines Relikt aus der Zeit der seriell verkabelten Hardware-Terminals.
/dev/
ist ein spezielles Verzeichnis für Gerätedateien. Dies sind Abstraktionen, keine echten Dateien auf der Festplatte. Das Verzeichnis wird beim Booten ausgefü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. Dies schließt die Einträge in ein /dev/pts
, bei denen es sich um Konsolengeräte handelt. Aus diesem Grund wird eine für Remotesitzungen erstellt. Sie werden auch erstellt, wenn Sie ein lokales GUI-Terminal öffnen.
Sie können sie als Dateien öffnen, obwohl sie nicht von großem Nutzen sind. Um den /dev/pts
Knoten zu ermitteln, mit dem Ihre Shell verbunden ist, verwenden Sie tty
:
> tty
/dev/pts/4
Wechseln Sie nun zu einer anderen Konsole und versuchen Sie Folgendes:
> echo "duck!" > /dev/pts/4
Klug. Versuchen Sie jetzt:
> cat /dev/pts/4
Versuchen Sie dann, die Shell unter / dev / pts / 4 zu verwenden. Du steckst fest, bis du das cat
auf der anderen Seite beendest, aber das meiste, was du auf pts / 4 tippst, wird durchgehen (z. B. "Hallo Welt", mit dem ich hl
auf pts / 4 und ello word
auf der cat
Konsole gelandet bin ).
Ich vermute hier, dass das Gerät Eingaben von der Shell nimmt und über das System ausgibt, was bedeutet, dass Dinge auf dem Bildschirm landen - die Shell befasst sich nicht mit Hardware, sondern mit dem System. Probieren Sie es aus strace bash
(und schauen man strace
Sie sich an, wenn Sie nicht wissen, was es ist); Sie erhalten eine vorläufige Flut von Anrufen, wenn die Bash startet. Schlagen Sie jetzt die Tasten:
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 von der Standardausgabe geschrieben. Aber womit ist der Standard der Shell verbunden? Probieren strace
Sie jetzt Ihr GUI-Terminal aus - Sie müssen den Namen herausfinden, wenn Sie ihn nicht kennen, z. B. unter KDE konsole
, und GNOME hat den gnome-terminal
, glaube ich. Die Ausgabe davon strace
ist wahrscheinlich kryptischer - meine hat viel poll()
und recvfrom()
. Ich sehe keine Schreibvorgänge, aber wenn Sie jetzt den cat
Trick von einem anderen Terminal aus ausführen, werden Sie feststellen, dass die von cat gelesenen Tastenanschläge bei der Ausgabe von strace überhaupt keine Reaktion hervorrufen - das Terminal ist nicht ' Ich empfange sie nicht. Daher konkurrieren die GUI-Terminal-App und die Katze, um von demselben Gerät zu lesen, in das die Shell ausgibt.
echo Hello > /dev/pts/1
... Sehen Sie, was passiert, es ist Ihr Terminal.