Auf Lubuntu 18.04 starte ich eine Shell in lxterminal. Sein steuerndes Terminal ist der aktuelle Pseudoterminal-Slave:
$ tty
/dev/pts/2
Ich würde gerne wissen, welche Beziehungen zwischen meinem aktuellen Controlling-Terminal /dev/pts/2
und bestehen /dev/tty
.
/dev/tty
verhält sich wie mein aktuelles Steuerterminal/dev/pts/2
:$ echo hello > /dev/tty hello $ cat < /dev/tty world world ^C
Aber es scheint sich um nicht verwandte Dateien zu handeln, anstatt dass ein Symlink oder Hardlink zum anderen ist:
$ 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 Steuerterminals, wenn
/dev/tty
garantiert ist, dass es sich um deren Steuerterminals handelt. Wie können es verschiedene steuernde Terminals sein, ohne ein Symlink oder Hardlink zu sein?
Was sind ihre Beziehungen und Unterschiede? Jede Hilfe wird sehr geschätzt!
Dieser Beitrag stammt von einem früheren Beitrag. Beziehen sich die Ausgabe des Befehls `tty` und die Datei` / dev / tty` beide auf das steuernde Terminal des aktuellen Bash-Prozesses?
tty
wird das steuernde Terminal nicht gemeldet, aber das Terminal ist auf stdin geöffnet, falls vorhanden. Sieheps -o tty= -p "$$"
für das steuernde Terminal (in der Praxis sind sie an der Eingabeaufforderung einer interaktiven Shell im Allgemeinen gleich).ps -o tty= -p "$$"
funktioniert gut! Ist es nicht möglich, das steuernde Terminal der aktuellen Shell abzurufen/dev/tty
?/dev/tty
, anruftioctl(TIOCGDEV, &dev)
, um das Maj: Min Devnum der Realität zu erhalten , und dann danach sucht/dev
. Dies führt jedoch zu mehrdeutigen Ergebnissen, wenn mehr als ein devpts-Dateisystem bereitgestellt wird.Antworten:
Die
tty
Manpage in Abschnitt 4 behauptet Folgendes:Dies würde zum Teil erklären, warum
/dev/tty
kein Symlink zum steuernden Terminal vorhanden ist: Es würde ein zusätzliches unterstützenioctl
, und es gibt möglicherweise kein steuerndes Terminal (aber ein Prozess kann immer versuchen, darauf zuzugreifen/dev/tty
). Die Dokumentation ist jedoch falsch: Die zusätzlicheioctl
ist nicht nur über zugänglich/dev/tty
(siehe die Antwort von mosvy , die auch eine vernünftigere Erklärung für die Art von gibt/dev/tty
)./dev/tty
kann verschiedene steuernde Terminals darstellen, ohne eine Verbindung zu sein, da der Treiber, der sie implementiert, bestimmt, was das steuernde Terminal des aufrufenden Prozesses ist, falls vorhanden.Sie können sich dies als
/dev/tty
das steuernde Terminal vorstellen und somit Funktionen anbieten, die nur für ein steuerndes Terminal sinnvoll sind, während/dev/pts/2
usw. einfache Terminals sind, von denen eines das steuernde Terminal für einen bestimmten Prozess sein kann.quelle
/dev/tty
das für den Prozess?/dev/tty
ist ein "magisches" Zeichengerät, das beim Öffnen einen Griff zum aktuellen Terminal zurückgibt.Unter der Annahme, dass sich das steuernde Terminal befindet
/dev/pts/1
, verweist ein über/dev/pts/1
und einer über geöffneter Dateideskriptor/dev/tty
auf dasselbe Gerät. Jeder Schreib-, Lese- oder andere Dateivorgang funktioniert bei beiden gleich.Insbesondere akzeptieren sie den gleichen Satz von Ioctls und
TIOCNOTTY
sind kein zusätzliches Ioctl, das nur über verfügbar ist/dev/tty
.ioctl(fd, TIOCNOTTY)
funktioniert auf allen Dateideskriptoren, die sich auf ein Terminal beziehen, genauso, vorausgesetzt, es ist das steuernde Terminal des Prozesses, der es aufruft.Dabei spielt es keine Rolle , ob der Deskriptor durch Öffnen erhalten wurde
/dev/tty
,/dev/pts/1
,/dev/ptmx
(in diesem Fall der ioctl auf seinem entsprechenden handeln Slave ), oder in jüngerer Zeit durch einen Aufrufioctl(master, TIOCGPTPEER, flags)
.Beispiel:
Außerdem wird der aktuelle Prozess nicht wirklich vom tty "getrennt". Der Prozess kann weiterhin daraus lesen, ein
^C
auf dem Terminal wird ihn töten usw. Die einzige Auswirkung auf einen Prozess, der kein Sitzungsleiter ist, besteht darin, dass auf die tty nicht mehr über zugegriffen werden/dev/tty
kann und dies auch nicht mehr der Fall ist aufgeführt als steuernde tty in/proc/PID/stat
:[Das 7. Feld von
/proc/<pid>/stat
ist die Geräte-ID des steuernden Tty, sieheproc(5)
]Wenn der Prozess, der ihn aufruft, der Sitzungsleiter ist, trennt er die Sitzung wirklich vom tty und sendet von der Sitzung ein
SIGHUP
/SIGCONT
pair an die Vordergrundprozessgruppe. Aber selbst dann wird das Terminal nicht geschlossen und der Prozess kann immer noch daraus lesen, wenn er Folgendes überlebtSIGHUP
:/dev/tty
ist kein Symlink wie/dev/stdin
=>/dev/fd/0
=>/proc/self/fd/0
=>,/dev/pts/0
da er lange vor virtuellen dynamischen Dateisystemen wie procfs (und lange vor Symlinks im Allgemeinen) erfunden wurde. Und viele Programme haben sich auf ihrer besonderen Semantik abhängen (zB./dev/tty
Andernfalls mit ,ENODEV
wenn der Steueranschluss ist nicht zugänglich).quelle
tty
Code wurdeTTIOCNOTTY
seit Ewigkeiten generisch behandelt.&
(entweder echte Hintergrundjobs oder Background-Lite wie aus Skripten, Shells ohne Jobsteuerung usw.), sind immer noch an das steuernde Terminal "angehängt", sie geben nicht einmal vor, sich davon zu lösen.