Émulateurs de terminaux
Le côté maître remplace la ligne (la paire de fils TX / RX) qui va au terminal.
Le terminal affiche les caractères qu’il reçoit sur l’un des fils (certains d’entre eux sont des caractères de contrôle et lui permettent de déplacer le curseur, de changer de couleur, etc.) et d’envoyer sur un autre fil les caractères correspondant aux touches que vous tapez.
Les émulateurs de terminaux tels que xterm ne sont pas différents, mais au lieu d’envoyer et de recevoir des caractères sur des câbles, ils lisent et écrivent des caractères sur leur descripteur de fichier côté maître. Une fois qu'ils ont créé le terminal esclave et démarré votre shell, ils ne le touchent plus. En plus d'émuler la paire de fils, xterm peut également modifier certaines propriétés de la discipline de ligne via ce descripteur de fichier du côté maître. Par exemple, ils peuvent mettre à jour les attributs de taille afin qu'un SIGWINCH soit envoyé aux applications qui interagissent avec l'esclave esclave pour les informer de la modification de leur taille.
Autre que cela, il y a peu d' intelligence dans l'émulateur terminal / terminal.
Ce que vous écrivez sur un terminal (comme l'esclave pty) correspond à ce que vous voulez lire, ce que vous lisez est ce que vous avez tapé là-bas, il est donc inutile que l'émulateur de terminal lise ou écrit dessus. . Ils sont ceux à l'autre bout.
La discipline de la ligne tty
Une grande partie de l' intelligence est dans la discipline de ligne tty . La discipline de ligne est un module logiciel (résidant dans le pilote, dans le noyau) poussé au-dessus d’un périphérique série / pty situé entre ce périphérique et la ligne / fil (le côté maître pour un pty).
Une ligne série peut avoir un terminal à l’autre extrémité, mais également une souris ou un autre ordinateur pour la mise en réseau. Vous pouvez, par exemple, associer une discipline de ligne SLIP pour obtenir une interface réseau sur un périphérique série (ou un périphérique pty), ou une discipline de ligne tty . La discipline de ligne tty est la discipline de ligne par défaut au moins sous Linux pour les périphériques série et pty. Sous Linux, vous pouvez changer la discipline de ligne avec ldattach.
Vous pouvez voir l’effet de désactiver la discipline de ligne tty en émettant stty raw -echo(notez que l’invite bash ou d’autres applications interactives, telles que vidéfinir le terminal dans le mode exact dont ils ont besoin, vous souhaitez donc utiliser une application idiote comme catcelle-ci). Ensuite, tout ce qui est écrit sur le terminal esclave est immédiatement lu par xterm du côté maître, et chaque caractère écrit par xterm sur le côté maître est immédiatement disponible pour la lecture sur le périphérique esclave.
La discipline de ligne est l'endroit où l'éditeur de ligne interne du terminal est implémenté. Par exemple , avec stty icanon echo(comme la valeur par défaut), lorsque vous tapez a, xterm écrit aau maître, puis la discipline ligne échos en arrière (fait un adisponible pour la lecture par l' xtermaffichage), mais ne fait rien disponible pour la lecture sur le côté esclave . Ensuite, si vous tapez backspace, xterm envoie un caractère ^?ou ^H, la discipline de ligne (telle que ^?ou ^Hcorrespondant au eraseparamètre de discipline de ligne) renvoie au maître a ^H, spaceet ^Hpour xtermeffacer leavous venez de taper sur son écran et n'envoyez toujours rien à l'application qui lit le côté esclave, il met simplement à jour son tampon d'éditeur de lignes interne pour supprimer ce que avous avez déjà tapé.
Ensuite, lorsque vous appuyez sur Entrée, xterm envoie ^M(CR), que la discipline de ligne convertit en entrée en ^ J (LF), et envoie ce que vous avez entré jusqu'à présent pour être lu du côté esclave (une application lisant dessus /dev/pts/xrecevra ce vous avez tapé en incluant le LF, mais pas le adepuis que vous l'avez supprimé), tandis que du côté maître, il envoie un CR et un LF pour déplacer le curseur à la ligne suivante et au début de l'écran.
La discipline de ligne est également responsable de l’ envoi du SIGINTsignal au groupe de processus de premier plan du terminal lorsqu’il reçoit un ^Ccaractère du côté maître, etc.
De nombreuses applications de terminaux interactifs désactivent la plupart des fonctionnalités de cette discipline de ligne pour les implémenter elles-mêmes. Mais dans tous les cas, sachez que le terminal ( xterm) a peu d’implication dans cette tâche (à part l’affichage de ce qu’il est dit d'afficher).
Et il ne peut y avoir qu'une seule session par processus et par terminal. Un terminal de contrôle peut être associé à une session sans que cela soit nécessaire (toutes les sessions démarrent sans terminal jusqu'à ce qu'elles en ouvrent un). xtermDans le processus qu’il demande à exécuter votre shell créera généralement une nouvelle session (et par conséquent se détachera du terminal à partir duquel vous avez été lancé le xtermcas échéant), ouvrez la nouvelle création /dev/pts/xqu’il a engendrée, en reliant ce périphérique terminal à la nouvelle session. Il exécutera ensuite votre shell dans ce processus, de sorte que votre shell deviendra le leader de la session. Votre shell ou tout shell interactif de cette session jonglera généralement avec les groupes de processus et tcsetpgrp(), pour définir les tâches de premier plan et d’arrière-plan pour ce terminal.
Quant aux informations stockées par un terminal avec une discipline tty (série ou pty) , c'est généralement ce que la sttycommande affiche et modifie. Toute la configuration de la discipline: taille de l’écran du terminal, local, indicateurs de sortie, réglages des caractères spéciaux (comme ^ C, ^ Z ...), vitesse d’entrée et de sortie (non pertinent pour les ptys). Cela correspond aux fonctions tcgetattr()/ tcsetattr()qui sous Linux correspondent aux TCGETS/ TCSETSioctls et TIOCGWINSZ/ TIOCSWINSZpour la taille de l'écran. Vous pouvez faire valoir que le groupe de processus de premier plan actuel est une autre information stockée dans le périphérique terminal ( tcsetpgrp()/ tcgetpgrp(), TIOC{G,S}PGRPioctls) ou dans le tampon d’entrée ou de sortie actuel.
Notez que les informations de taille d'écran stockées dans le terminal peuvent ne pas refléter la réalité. L’émulateur de terminal le définit généralement (via le même ioctl sur la taille du maître) lorsque sa fenêtre est redimensionnée, mais il peut se désynchroniser si une application appelle ioctl du côté esclave ou si le redimensionnement n’est pas transmis (en cas d’une connexion ssh qui implique un autre pty engendré par sshdif sshignore SIGWINCHpar exemple). Certains terminaux peuvent également être interrogés sur leur taille via des séquences d'échappement. Ainsi, une application peut l'interroger de cette manière et mettre à jour la discipline de ligne avec ces informations.
Pour plus de détails, vous pouvez consulter les pages de manuel termioset tty_ioctlde Debian, par exemple.
Pour jouer avec d'autres disciplines de la ligne:
- Émulez une souris avec un pseudo-terminal: - socat pty,link=mouse fifo:fifo
sudo inputattach -msc mouse # sets the MOUSE line discipline and specifies protocol
xinput list # see the new mouse there
exec 3<> fifo
printf '\207\12\0' >&3 # moves the cursor 10 pixels to the right
 - Ci-dessus, le côté maître du lot est terminé par socat sur un pipe nommé ( - fifo). Nous connectons ce fifo à un processus (le shell) qui écrit 0x87 0x0a 0x00, ce qui signifie dans le protocole du système de souris- no button pressed, delta(x,y) = (10,0). Ici, nous (le shell) n'émulons pas un terminal, mais une souris, les 3 octets que nous envoyons ne doivent pas être lus (potentiellement transformés) par une application du périphérique terminal (- mousece qui est un lien symbolique créé par- socatun- /dev/pts/xpériphérique). , mais doivent être interprétés comme un événement d’entrée de la souris.
 
- Créez une interface SLIP: - # on hostA
socat tcp-listen:12345,reuseaddr pty,link=interface
# after connection from hostB:
sudo ldattach SLIP interface
ifconfig -a # see the new interface there
sudo ifconfig sl0 192.168.123.1/24
# on hostB
socat -v -x pty,link=interface tcp:hostA:12345
sudo ldattach SLIP interface
sudo ifconfig sl0 192.168.123.2/24
ping 192.168.123.1 # see the packets on socat output
 - Ci-dessus, le fil série est émulé par - socatun socket TCP entre hostA et hostB. La discipline de ligne SLIP interprète les octets échangés sur cette ligne virtuelle en tant que paquets IP encapsulés SLIP pour livraison sur l'- sl0interface.