- Pseudoterminal
-
Ein Pseudoterminal ist ein Systemdienst in einer Unix-Umgebung, der meist vom Kernel bereitgestellt wird.
Das Pseudoterminal ist eine Art der Interprozesskommunikation, eine bidirektionale Pipe, die den Datenfluss interpretiert und auf konfigurierbare Ereignisse speziell reagiert. Diese zusätzlichen Funktionen des Pseudoterminals sind dieselben, die innerhalb des Kernels mit einem normalen (z. B. seriellen) Terminal assoziiert werden.
Architektur bei normalem Terminal
Textanwendung <---> Terminalgerät <-K-> serielle Schnittstelle shell <---> /dev/ttyS0 <-K-> Kerneltreiber für s. Schnittstelle
Architektur eines Pseudoterminals
Textanwendung <---> Slave <-K-> Master <---> Terminalemulation/Netzwerkserver shell <---> /dev/pts/1 <-K-> /dev/ptmx <---> sshd shell <---> /dev/pts/23 <-K-> /dev/ptmx <---> screen
<-K->
bedeutet: innerhalb des Kernels verbunden.Funktionsweise
Ein Terminal ermöglicht die textorientierte Ein/Ausgabe. Dabei ist eine Seite immer mit einem Prozess verbunden, das heißt, der Prozess hat eine Gerätedatei des Terminals geöffnet (
/dev/ttyS0
,/dev/tty1
, …). Die andere Seite des Terminals wird z. B. mit einer seriellen Schnittstelle verbunden (ttySn
) oder mit der Systemkonsole (Monitor/Tastatur) (ttyn
) (n = 0, 1, 2, …). Beim Pseudoterminal ist die andere Seite wiederum mit einem Prozess verbunden. Ein Pseudoterminal hat eine Master- und eine Slave-Seite. Die Slave-Seite ist das Äquivalent zu einem normalen Terminal-Gerät, die Master-Seite ist (im Kernel) direkt mit der Slave-Seite verbunden. Der Master ist also das, was bei einem normalen Terminal die serielle Schnittstelle ist, nur dass statt mit einer seriellen Schnittstelle Daten auszutauschen, dies mit einem Prozess geschieht. Deswegen ist ein Pseudoterminal auch eine Form der Interprozesskommunikation. Im Unterschied zu einer Pipe oder einem Unix Domain Socket werden die Daten aber während des Transits von Master zu Slave interpretiert. Falls bestimmte Escape-Sequenzen übertragen werden sollen, werden sie nicht an den Slave weitergereicht, sondern lösen eine Aktion aus. Zum Beispiel wird dem Prozess, der die Slave-Seite geöffnet hat ein SIGINT-Signal geschickt, wenn in den Master 0x03 geschrieben wird (Steuerung+C). Diese Interpretation heißt Flusskontrolle. Wird Steuerung+S (0x13) in den Master geschrieben, dann bekommt der Prozess, der den Slave geöffnet hat (genauer: der den Slave zu seinem controlling tty gemacht hat) ein SIGSTOP-Signal und bei Steuerung+Q (0x11) ein SIGCONT-Signal.Diese Funktionen hat auch der Gerätetreiber für ein normales Terminal, die Interprozessverbindung wird um diese Funktionen bei einem Pseudoterminal ergänzt.
Wenn es heißt: ein Prozess schreibt in den Master, dann ist das vergleichbar mit: ein Terminalgerät überträgt Daten über die serielle Schnittstelle zum Computer. Die Zusatzfunktion eines Pseudoterminals gegenüber einer Pipe ist also marginal, eine Shell wird aber wichtige Funktionen (Job Control, Flow Control, zeichenorientierte Eingabe) mit einer Pipe nicht zur Verfügung stellen können. Häufig werden Pseudoterminals für netzwerktransparente Terminalverbindungen benutzt (telnet, ssh) und für GUI-basierte Terminalemulationen (xterm).
Programme die Pseudoterminals benutzen
- screen
- ein Fenstermanager für den Textmodus
- xterm
- eine Terminalemulation für X11
- sshd
- Terminalserver
screen öffnet pro Fenster einen neues Master/Slave-Paar.
shell <---> slave <-K-> master <---> "screen" <---> master2 <-K-> slave2 <---> shell2 ^ | shell3 <---> slave3 <-K-> master3 <--------|------> master4 <-K-> slave4 <---> shell4
Wenn man einen screen in einem xterm ausführt, ergibt sich folgendes Bild:
shell <---> slave1 <-K-> master1 <---> screen <---> slave2 <-K-> master2 <---> xterm
Früher hießen die Master typischerweise
/dev/ptyp0
,/dev/ptyp1
, … und die dazugehörigen Slaves/dev/ttyp0
,/dev/ttyp1
. Heutzutage gibt es einen Master,/dev/ptmx
(pseudo terminal multiplexer), den man beliebig oft öffnen kann. Jedes Mal kann man dabei einen neuen Slave allozieren (ioctl). Die Slaves heißen dann z. B./dev/pts/1
,/dev/pts/23
.
Wikimedia Foundation.