Mein derzeitiges Verständnis der Signale von der Tastatur im Terminal basiert hauptsächlich auf dem Versuch, meine Beobachtungen dem zuzuordnen, was auf Google zu finden ist:
- Benutzer drückt Cc
- Dies wird als Byte an den Eingangspuffer des Terminals gesendet, das durch Löschen von 2 ganz linken Bits aus dem 7-Bit-ASCII-Wert von c berechnet wird
Danach fängt es an wirklich neblig zu werden, weil die Konfiguration, welcher Eingang welches Signal bedeutet, in Terminal (stty) erfolgt. Ich nehme an, es bedeutet, dass das Terminal selbst das Signal an den Prozess sendet. Aber ich denke auch, dass dieses Terminal nicht über Anwendungen Bescheid weiß, die es lesen.
Wie funktioniert das Senden eines Signals per Tastatur im Terminal von Ende zu Ende?
Antworten:
Durch Drücken von, Cwährend Ctrlgedrückt wird, wird ein Tastendruck gefolgt von einem Tastenfreigabe-X11-Ereignis an den Terminalemulator gesendet.
Bei diesem Ereignis (im Allgemeinen bei einem Tastendruck) schreibt der Terminal-Emulator das 0x3-Byte (
^C
) in seinen Dateideskriptor auf der Masterseite des Pseudotty-Geräts.Wenn die
isig
Termios-Einstellung des Geräts aktiviert und dieintr
Einstellung auf dieses 0x3-Byte festgelegt ist, sendet der Kernel das SIGINT-Signal an alle Mitglieder der Vordergrundprozessgruppe des Endgeräts (ein weiteres im pty-Gerät gespeichertes Attribut). In diesem Fall steht das 0x3-Byte auf der Slave-Seite des Pty nicht zum Lesen zur Verfügung.Normalerweise sind es interaktive Shells, die Prozessgruppen (mit
setpgid()
) für Shell-Jobs erstellen und entscheiden, welche in den Vordergrund gestellt werden sollen (mittcsetpgrp()
, um das Attribut des Pty-Geräts festzulegen) oder nicht.Zum Beispiel, wenn Sie an der Eingabeaufforderung einer interaktiven Shell ausgeführt werden:
Die Shell startet eine neue Prozessgruppe mit zwei Prozessen (in denen sie ausgeführt wird
foo
undbar
nachdem sie ihr stdin / out mit einer Pipe verbunden hat) und stellt diese Gruppe in den Vordergrund. Beide Prozesse würden den SIGINT erhalten, wenn Sie Strg-C drücken.Im:
Gleich, aber die Prozessgruppe wird nicht in den Vordergrund gestellt (und die Shell wartet auch nicht darauf, sodass Sie andere Befehle eingeben können). Diese Prozesse würden den SIGINT nicht bei Strg-C erhalten, sondern könnten angehalten werden, wenn sie versuchen, vom tty-Gerät zu lesen.
Weitere Informationen finden Sie unter: Welche Aufgaben hat jede Pseudo-Terminal-Komponente (Software, Master-Seite, Slave-Seite)?
quelle