Wer entscheidet, welche Anwendung das Signal von der Tastatur empfängt?

16

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?

calavera.info
quelle
1
Keine Antwort für sich, aber lesenswert: Der TTY entmystifiziert , von lft.
Duskwuff

Antworten:

33

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 isigTermios-Einstellung des Geräts aktiviert und die intrEinstellung 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 (mit tcsetpgrp(), um das Attribut des Pty-Geräts festzulegen) oder nicht.

Zum Beispiel, wenn Sie an der Eingabeaufforderung einer interaktiven Shell ausgeführt werden:

foo | bar

Die Shell startet eine neue Prozessgruppe mit zwei Prozessen (in denen sie ausgeführt wird foound barnachdem 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:

foo | bar &

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)?

Stéphane Chazelas
quelle
2
Danke für die reichhaltige Antwort. Ich werde versuchen, den Kern der Antwort neu zu formulieren, um sicherzustellen, dass ich sie verstehe: Das Signal wird vom Kernel gesendet, der das tty-Gerät selbst auf Eingaben überwacht, die in den Geräteattributen konfiguriert sind (von jedem, der es konfigurieren möchte). und der Kernel sendet es an die Prozessgruppe, die ebenfalls in den Geräteattributen konfiguriert ist (hauptsächlich von der Shell als eine der Aufgaben eines Sitzungsleiters). Ich hoffe das ist richtig.
calavera.info
1
@ calavera.info, ja das stimmt. Im Fall eines realen Terminals am Ende eines seriellen Kabels sucht der Kernel nach dem 0x3-Byte, das von der Leitung kommt. Bei einem Pseudo-Terminal ersetzt die Masterseite den Draht. Und der Kernel sucht nach diesem 0x3-Byte in den Bytes, die der Terminal-Emulator dorthin gesendet hat. Siehe auch die Bearbeitung mit einem Link zu einem anderen Q & A mit mehr Details (wie die Tatsache , dass die Kernel - Verarbeitung Teil eines modularen Aufbaus ist die erfolgt, wenn das Gerät als „Terminal“ -Gerät (Klemme verwendet Linie Disziplin ).
Stéphane Chazelas
Sagte die Frage nicht Terminal statt Terminalemulator ? Ich nehme an, es macht keinen großen Unterschied, da der Emulator so viel wie möglich wie ein Terminal agiert ...
Toby Speight
2
@Toby, ja, da heutzutage kaum jemand ein echtes Terminal benutzt, nahm ich an, dass das OP Terminalemulatoren bedeutet (viele von ihnen werden "Terminal" genannt). Siehe auch meinen Kommentar über Ihren und die verknüpften Fragen und Antworten für weitere Details.
Stéphane Chazelas
1
@TobySpeight Ja, ich habe nach einem Terminal gefragt, weil ich es mit dem realen Terminal über eine serielle Leitung zu tun habe, aber die Antwort und die folgenden Kommentare waren in beiden Fällen vollständig gültig.
calavera.info