Angenommen, ich habe ein Programm vom Terminal aus geöffnet und das stdin
und stdout
und stderr
in 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:
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?
cron
dercron
Prozess der übergeordnete Prozess. Die einzige Möglichkeit, dies zu umgehen, besteht darin, einen Kernel zu booten und eineinit=/program
- aber dann konnte man keine E / A zu / von ihrAntworten:
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.)
quelle
ioctl()
tun, siehe stackoverflow.com/a/30693006/3701431