Qui décide quelle application reçoit le signal du clavier?

16

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?

calavera.info
la source
1
Pas une réponse en soi, mais mérite d'être lu: le TTY démystifié , par lft.
duskwuff

Réponses:

33

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 isigparamètre termios du périphérique est activé et si le intrparamè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 (avec tcsetpgrp()pour définir cet attribut du périphérique pty) ou non.

Par exemple, lorsque vous exécutez à l'invite d'un shell interactif:

foo | bar

Le shell démarre un nouveau groupe de processus avec deux processus (dans lesquels il s'exécute fooet baraprè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:

foo | bar &

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

Stéphane Chazelas
la source
2
Merci pour la riche réponse. Je vais essayer de reformuler le cœur de la réponse pour être sûr que je le comprends: le signal est envoyé par le noyau, qui surveille le périphérique tty lui-même pour les entrées configurées dans les attributs du périphérique (par celui qui veut le configurer) et le noyau l'envoie au groupe de processus qui est également configuré dans les attributs de périphérique (principalement par shell comme l'une des fonctions d'un chef de session). J'espère que c'est correct.
calavera.info
1
@ calavera.info, oui c'est correct. Dans le cas d'un vrai terminal à l'extrémité d'un câble série, le noyau recherche cet octet 0x3 provenant du fil. Pour un pseudo-terminal, le côté maître remplace le fil. Et le noyau recherche cet octet 0x3 dans les octets envoyés par l'émulateur de terminal. Voir aussi l'édition avec un lien vers un autre Q&A avec plus de détails (comme le fait que le traitement du noyau fait partie d'une conception modulaire qui se fait lorsque l'appareil est utilisé comme un appareil "terminal" ( discipline de la ligne terminale ).
Stéphane Chazelas
La question ne disait-elle pas terminal plutôt qu'émulateur de terminal ? Je ne suppose pas que cela fait beaucoup de différence, étant donné que la fonction de l'émulateur est d'agir autant que possible comme un terminal ...
Toby Speight
2
@Toby, oui, puisque presque personne n'utilise de vrai terminal ces jours-ci, j'ai supposé que l'OP signifiait des émulateurs de terminal (beaucoup d'entre eux sont appelés "terminaux"). Voir aussi mon commentaire au-dessus du vôtre et les questions et réponses liées pour plus de détails.
Stéphane Chazelas
1
@TobySpeight Oui, je posais des questions sur un terminal parce que je traite avec le vrai terminal sur une ligne série, mais la réponse et les commentaires suivants étaient complètement valables pour les deux cas.
calavera.info