Relations entre les caractères de contrôle, les signaux et le terminal

Quelles sont les relations entre les caractères de contrôle et les signaux? Ou sont-ils sans rapport?

Les caractères de contrôle sont-ils reçus par un terminal?

Une fois qu'un terminal a reçu un caractère de contrôle, le terminal envoie-t-il un signal à un process de l'action possible du terminal au caractère de contrôle reçu?

Par exemple,

sous Linux, dans un terminal, Ctrl + C mettra fin à un process de premier plan en cours d'exécution. En ASCII, Ctrl + C est un caractère de contrôle qui signifie "End of Text" .

En ASCII, Ctrl + D est un caractère de contrôle qui signifie la fin de la transmission. Est-ce que le caractère de contrôle fait que le terminal envoie un signal à un process quelconque?

Le pilote de terminal (partie du operating system) établit la relation entre les caractères spéciaux et les signaux. Les parameters de votre terminal , par exemple, l'utilisation de stty , sont ce qu'il utilise pour décider de ce que (si quoi que ce soit) à faire avec les caractères que vous tapez. Vous pouvez réaffecter ces caractères spéciaux au besoin avec quelques mises en garde:

  • un seul caractère spécial par fonction
  • seuls les caractères à un seul octet sont utilisés

le contrôle C et le contrôle D sont classiques : alors que quelques applications peuvent coder ces valeurs en dur, le pilote du terminal ne le requirejs pas.

Le pilote du terminal est un logiciel qui ne fait pas partie de votre terminal . Pour certains keyboards, vous pouvez find différentes affectations de caractères spéciaux plus pratiques que d'autres (et pour différents systèmes d'exploitation, certains choix des valeurs par défaut des caractères spéciaux peuvent différer).

Pour en savoir plus:

  • 11.1.9 Caractères spéciaux (interface de terminal général POSIX *)
  • 11. Interface de terminal général
  • stty – Définir les options pour un terminal

Les caractères de contrôle et les signaux sont en quelque sorte liés. Vous pouvez voir la correspondance entre les signaux et les caractères avec la command stty -a dans un terminal. Un server RHEL auquel je peux accéder indique:

 -bash-3.2$ stty -a speed 38400 baud; rows 24; columns 135; line = 0; intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0; -parenb -parodd cs8 -hupcl -cstopb cread -clocal -crtscts -cdtrdsr -ignbrk -brkint -ignpar -parmrk -inpck -issortingp -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany -imaxbel -iutf8 opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0 isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke 

Une partie de cela est liée à l'ATS et ce qu'il fait pour entrer, d'autres choses à des signaux. Les parties pour les signaux:

 intr = ^C; quit = ^\; susp = ^Z; 

Cela signifie que SIGINT est control-C, SIGQUIT est control-backslash et SIGSTOP est control-Z. Vous pouvez réaffecter tout ou partie de ceux-ci, si vous le souhaitez. Voir l' man stty .

Les autres caractères de contrôle comme erase ou werase sont interceptés et utilisés par le pilote du terminal lui-même. Comme lorsque vous reculez, le pilote du terminal efface un caractère de l'écran et du stream d'input. Le "mode" du pilote de terminal (cru ou cuit, éventuellement partiellement cuit) fait également la différence. Les éditeurs de text comme vim et emacs utilisent beaucoup les caractères de contrôle et ils n'obtiennent pas de SIGINT ou SIGQUIT ou autre lorsque vous tapez ces caractères de contrôle. Un programme peut mettre l'ATS en mode "brut" et il suffit de lire les octets sans interprétation par le pilote du terminal.