Was ist der Zweck des steuernden Terminals?

11

Angenommen, ich habe ein Programm vom Terminal aus geöffnet und das stdinund stdoutund stderrin drei Dateien umgeleitet .

Obwohl dieses Programm seine Ausgabe nicht mehr an das Terminal sendet und seine Eingabe nicht mehr vom Terminal empfängt, hat das Programm immer noch eine "Verbindung" zum Terminal. Das Terminal, mit dem das Programm diese "Verknüpfung" hat, wird als steuerndes Terminal bezeichnet . Das folgende Bild zeigt dies:

Geben Sie hier die Bildbeschreibung ein

Meine Frage ist: Was ist der Zweck des steuernden Terminals? Ich vermute, dass das steuernde Terminal verwendet werden kann, um Signale an das Programm zu senden (zum Beispiel :) Ctrl+C.

Gibt es andere Zwecke für das steuernde Terminal?

John
quelle
Da es sich um einen Unterprozess der Shell handelt, die Sie im Terminal ausgeführt haben. Selbst wenn Sie dies von soem aus ausführen würden, wäre eine andere Funktion wie cronder cronProzess der übergeordnete Prozess. Die einzige Möglichkeit, dies zu umgehen, besteht darin, einen Kernel zu booten und eine init=/program- aber dann konnte man keine E / A zu / von ihr
umleiten

Antworten:

7

Mit dem steuernden Terminal kann der Prozess dem Kernel mitteilen, welche Prozessgruppe die Vordergrundprozessgruppe ist (in derselben Sitzung). Wenn es eine Vordergrundprozessgruppe für ein Terminal gibt, können wir die Vordergrundprozessgruppe über das Terminal steuern, z. B. Strg-C / Strg- \, um die Vordergrundprozessgruppe zu beenden. (Ein Terminal hat möglicherweise nur eine Vordergrundprozessgruppe oder keine. Um es genau auszudrücken, kann ein Terminal nur einer Prozesssitzung zugeordnet werden.)

Mit dem steuernden Terminal können Sie auch dann, wenn Sie stdin bereits an andere Orte / Dateien umleiten, vom / zum steuernden Terminal lesen / schreiben /dev/tty. Diese spezielle Datei ist ein Synonym innerhalb des Kernels für das steuernde Terminal des aktuellen Prozesses. Wenn Ihrem Prozess kein steuerndes Terminal zugeordnet ist, schlägt das Öffnen dieser Datei fehl. Was können Sie in Bezug auf diese Datei tun? Bei einigen Programmen muss der Benutzer beispielsweise ein Kennwort eingeben, bevor er etwas ausführt, z. B. Programme zur Anmeldung oder Verschlüsselung. Diese Programme verhindern möglicherweise, dass Benutzer ein Kennwort von stdin eingeben. Selbst wenn Sie deren stdin in eine zufällige Datei umleiten, warten sie dennoch auf Ihren Typ. Der Grund ist, dass sie alle offen / dev / tty zum Lesen sind.

Zusammenfassend lässt sich sagen, dass der Kernel bei der Steuerung des Terminals weiß, wo das vom Terminal generierte Signal und die Terminaleingabe zu liefern sind, wenn sie von jemandem erwartet werden. Das ist alles.

Es ist daher nicht erforderlich, dass ein Prozess einem steuernden Terminal zugeordnet wird, wenn er nicht von einem Terminal gesteuert werden möchte und nicht von / nach "/ dev / tty" lesen / schreiben möchte (wie die meisten Daemon-Programme) ). Einem allgemeinen Prozess, der innerhalb einer Shell gestartet wird, ist jedoch immer ein steuerndes Terminal zugeordnet, da er Mitglied der Shell-Sitzung ist, die bereits beim Start der Shell ein steuerndes Terminal eingerichtet hat. (Tatsächlich kann ein zufälliger Prozess ein Terminal nicht als steuerndes Terminal anhängen, sondern nur den Sitzungsleiterprozess.)

Bruce
quelle
Ihr erster Punkt ist falsch und wird von Ihrem zweiten widerlegt. Bei Vordergrund- und Hintergrundprozessen werden die Steuerterminals nicht entfernt.
JdeBP
Danke @JdeBP, du hast recht. Ich habe meine Antwort geändert.
Bruce
Diese Jobsteuerung kann nur im Benutzerland implementiert werden. Die Steuerung des Terminals oder des gesamten Terminal-Subsystems scheint eine alte Sache zu sein, da wir nur ein Endgerät anstelle eines LCD-Bildschirms und einer Tastatur haben.
13 薯条 德里克
"Ein zufälliger Prozess kann ein Terminal nicht als steuerndes Terminal anhängen, sondern nur den Sitzungsleiterprozess." Technisch gesehen kann ein privilegierter Prozess mit CAP_SYS_ADMIN-Funktion dies ioctl()tun, siehe stackoverflow.com/a/30693006/3701431
Sergiy Kolodyazhnyy