Ma compréhension actuelle des signaux provenant du clavier dans le terminal est (basée en grande partie sur la tentative de mapper mes observations sur ce qui peut être trouvé sur Google):
- L'utilisateur appuie sur Cc
- Ceci est envoyé au tampon d'entrée du terminal sous forme d'octet qui est calculé en effaçant les 2 bits les plus à gauche de la valeur ascii de 7 bits de c
Après cela, il commence à être vraiment brumeux, car la configuration quelle entrée signifie quel signal est fait dans le terminal (stty). Je suppose que cela signifie que le terminal lui-même envoie le signal au processus. Mais je pense aussi que ce terminal ne connaît pas l'application qui le lit.
Comment fonctionne l'envoi d'un signal par clavier dans le terminal de bout en bout?
Réponses:
Une pression Ctout Ctrlest pressé envoie une pression de touche suivie d'événement KeyRelease X11 à l'émulateur de terminal.
Lors de cet événement (généralement celui de la touche), l'émulateur de terminal écrit l'octet 0x3 (
^C
) dans son descripteur de fichier du côté maître du périphérique pseudo-tty.Si le
isig
paramètre termios du périphérique est activé et si leintr
paramètre est défini sur cet octet 0x3, le noyau envoie le signal SIGINT à tous les membres du groupe de processus de premier plan du périphérique terminal (un autre attribut stocké dans le périphérique pty). Dans ce cas, l'octet 0x3 ne sera pas disponible pour la lecture du côté esclave du pty.Ce sont généralement des shells interactifs qui créent des groupes de processus (avec
setpgid()
) pour les jobs shell, et décident lequel mettre au premier plan (avectcsetpgrp()
pour définir cet attribut du périphérique pty) ou non.Par exemple, lorsque vous exécutez à l'invite d'un shell interactif:
Le shell démarre un nouveau groupe de processus avec deux processus (dans lesquels il s'exécute
foo
etbar
après avoir connecté leur stdin / out avec un canal) et met ce groupe au premier plan. Les deux processus recevraient le SIGINT si vous appuyez sur Ctrl-C.Dans:
Idem, mais le groupe de processus n'est pas mis en avant-plan (et le shell ne l'attend pas pour que vous puissiez entrer d'autres commandes). Ces processus n'obtiendraient pas le SIGINT sur Ctrl-C mais pourraient être suspendus s'ils essayaient de lire à partir du périphérique tty.
Plus de lecture sur: Quelles sont les responsabilités de chaque composant pseudo-terminal (PTY) (logiciel, côté maître, côté esclave)?
la source