Auf Lubuntu 18.04 führe ich eine Shell in lxterminal aus. Sein steuerndes Terminal ist der aktuelle Pseudoterminal-Slave:
$ tty
/dev/pts/2
Ich würde gerne wissen, welche Beziehungen zwischen meinem aktuellen steuernden Terminal /dev/pts/2
bestehen und /dev/tty
.
-
/dev/tty
verhält sich wie mein aktuelles Kontrollterminal/dev/pts/2
:$ echo hello > /dev/tty hello $ cat < /dev/tty world world ^C
-
Aber es scheinen nicht zusammenhängende Dateien zu sein, anstatt ein Symlink
oder Hardlink zum anderen zu sein:$ ls -lai /dev/tty /dev/pts/2 5 crw--w---- 1 t tty 136, 2 May 31 16:38 /dev/pts/2 13 crw-rw-rw- 1 root tty 5, 0 May 31 16:36 /dev/tty
Für verschiedene Sitzungen mit verschiedenen steuernden Terminals, wenn /dev/tty
ist garantiert ihre kontrollierenden Terminals. Wie können
es verschiedene steuernde Terminals sein, ohne ein Symlink oder
Hardlink zu sein?
Was sind also ihre Beziehungen und Unterschiede? Jede Hilfe wird sehr geschätzt!
Dieser Beitrag stammt aus einem früheren. Verweisen sowohl die Ausgabe des Befehls `tty` als auch die Datei `/dev/tty` auf das steuernde Terminal des aktuellen Bash-Prozesses?
Akzeptierte Antwort:
Das tty
Manpage in Abschnitt 4 behauptet Folgendes:
Die Datei /dev/tty ist eine Zeichendatei mit der Major-Nummer 5 und der Minor-Nummer 0, normalerweise im Modus 0666 und der Eigentümergruppe root.tty. Es ist ein
Synonym für das steuernde Terminal eines Prozesses, falls vorhanden.
Zusätzlich zu ioctl(2)
Anfragen, die von dem Gerät unterstützt werden, auf das sich tty
bezieht, der ioctl(2)
Fordern Sie TIOCNOTTY
an wird unterstützt.
TIOCNOTTY
Trennen Sie den aufrufenden Prozess von seinem steuernden Terminal.
Wenn der Prozess der Sitzungsleiter ist, dann SIGHUP
und SIGCONT
Signale
werden an die Prozessgruppe im Vordergrund gesendet und alle Prozesse in der
aktuellen Sitzung verlieren ihre steuernde TTY.
Dieses ioctl(2)
Aufruf funktioniert nur bei Dateideskriptoren, die mit /dev/tty verbunden sind . Es wird von Daemon-Prozessen verwendet, wenn sie von einem
Benutzer an einem Terminal aufgerufen werden. Der Prozess versucht, /dev/tty zu öffnen . Wenn das Öffnen
erfolgreich ist, trennt es sich vom Terminal, indem es TIOCNOTTY
verwendet , während, wenn das Öffnen fehlschlägt, es offensichtlich nicht mit einem
Terminal verbunden ist und sich nicht trennen muss.
Dies würde teilweise erklären, warum /dev/tty
ist kein symbolischer Link zum steuernden Terminal:Es würde ein zusätzliches ioctl
unterstützen , und es gibt möglicherweise kein steuerndes Terminal (aber ein Prozess kann immer versuchen, auf /dev/tty
zuzugreifen ). Allerdings ist die Dokumentation falsch:der Zusatz ioctl
ist nicht nur über zugänglich /dev/tty
(Siehe mosvys Antwort, die auch eine vernünftigere Erklärung für die Natur von /dev/tty
gibt ).
/dev/tty
kann verschiedene steuernde Terminals darstellen, ohne eine Verbindung zu sein, da der Treiber, der es implementiert, bestimmt, welches steuernde Terminal der aufrufende Prozess ist, falls vorhanden.
Sie können sich das als /dev/tty
vorstellen das steuernde Terminal ist und somit Funktionen bietet, die nur für ein steuerndes Terminal sinnvoll sind, während /dev/pts/2
usw. sind einfache Terminals, von denen eines das steuernde Terminal für einen bestimmten Prozess sein kann.