Comment fonctionne réellement l’écho dans Unix

Quand je tape n’importe quelle touche, normalement, elle est immédiatement renvoyée à l’écran de sortie std iemy.

Si je dois entrer un mot de passe, cela dit qu’il ne sera pas renvoyé, je ne peux pas voir les clés que je tape.

Comment cela marche-t-il.

Chaque pression sur une touche va-t-elle immédiatement au kernel (sans que j’appuie sur ENTRÉE), puis le kernel décide de les faire écho ou non? Comme, j’appuie sur ‘A’, ça va au kernel; le kernel lui fait écho; Je l’ai sur mon écran. Maintenant, je frappe à nouveau “B” … la même séquence …; Maintenant, j’ai AB sur mon écran (ma commande) et appuyez sur ENTRÉE; Ma commande va au kernel et est finalement exécutée.

Y a-t-il une autre explication? Que se passe-t-il en arrière-plan lors des appuis sur les touches?

Le pilote de terminal dans le kernel peut être mis dans plusieurs modes (il y a en fait beaucoup plus de drapeaux que cela, et ces jours “cbreak” est en réalité l’opposé d’un drapeau différent, donc c’est simplifié).

Le mode “cbreak” signifie que le processus qui tente de lire à partir du terminal recevra une saisie au clavier dès qu’il sera disponible. Lorsque le mode cbreak est désactivé, les données sont stockées par le kernel dans un tampon jusqu’à ce que enter soit pressé, et certaines clés comme backspace sont gérées par le kernel (lorsque vous appuyez sur backspace, cela supprime le caractère du tampon et – si le mode écho est on – écrit “backspace-space-backspace” dans le terminal pour écraser le caractère avec un espace vide.

Le mode Echo signifie que chaque fois que l’utilisateur appuie sur une touche, le kernel le renvoie immédiatement à l’écran. Quand il est éteint, rien ne sera renvoyé à l’écran et le programme devra l’écrire sur le terminal s’il veut que vous le voyiez.

Il existe plusieurs situations typiques:

  • Dans les programmes qui gèrent des entrées avancées (comme la plupart des shells, ou quelque chose comme un programme plein écran), cbreak est activé et l’écho est désactivé; le programme écrit le caractère dans le terminal lui-même s’il ne fait pas partie d’une séquence d’échappement de clé spéciale.
  • Dans la plupart des situations [la valeur par défaut avec un programme simple qui lit stdin et écrit stdout], l’écho est activé et cbreak est désactivé. Lorsque vous tapez, il se comporte comme je l’ai décrit ci-dessus, tout cela est géré par le kernel jusqu’à ce que vous appuyiez sur Entrée et l’envoie à l’application. L’édition des entrées est limitée à un retour arrière [et ctrl-u, ctrl-w], en essayant d’utiliser les touches fléchées, vous placerez simplement des séquences d’échappement telles que ^[[D dans la ligne de saisie.
  • Lors de la lecture d’un mot de passe, l’écho est désactivé et cbreak est désactivé. L’entrée fonctionne comme le cas par défaut, sauf que le kernel ne copie pas l’entrée sur l’écran.

Le programme en cours d’exécution indique au kernel quel mode il doit avoir avec les fonctions termios . Vous pouvez utiliser la commande stty pour faire la même chose dans un environnement shell, mais sachez que cela peut interférer avec la gestion des entrées du shell ou avec les programmes que vous exécutez.

Votre clavier génère des signaux élecsortingques qui sont finalement interprétés comme des codes clés correspondant à des lettres – «A», «B», les touches de fonction F1, F2, etc. Tout cela se produit dans le pilote de clavier géré par le kernel. Ce pilote de clavier dispose d’un tampon pour recevoir toutes les pressions sur le clavier et l’envoyer au kernel qui, à son tour, les dirige vers les processus en cours. Ce qu’il faut faire avec la séquence de clés est totalement déterminé par l’application individuelle, par exemple pour afficher les clés ou non.

programme echo fait partie de coreutils . Vous pouvez télécharger ses sources ici . Regardez src/echo.c c’est assez petit. Vous pouvez voir que echo utilise les fputc ou putchar . Ces appels concernent le stream standard appelé stdout . L’architecture des stream standard est assez compliquée et cela dépasse ce post. Vous pouvez le trouver en utilisant par exemple google .