J'essaie de comprendre Comment un TTY fonctionne1 (le flux de travail et les responsabilités de chaque élément). J'ai lu plusieurs articles intéressants à ce sujet, mais il y a encore des zones floues.
C'est ce que je comprends jusqu'à présent:
/dev/ptmx
, la partie maître du pseudo-terminal./dev/pts/[0-N]
, correspondant au port série obsolète et "attache" un pseudo-esclave.Voici mes questions:
pts
stocker? Xterm met--il à jour tous les champs par lui-même, ou le ptm
ajoutez-vous une "intelligence" sur elle?1. Je fonds ma compréhension sur le TTY Demystifié par Linus Akesson et le Kernel Linux par Andries Brouwer Posts, comme sur plusieurs autres questions sur ces sites
EDIT: Depuis cette réponse, j'ai écrit un article dédié sur mon blog, pour les personnes qui seraient intéressées par plus de détails.
Après beaucoup de lecture, c'est ce que j'ai compris.
PTMX a-t-il un but en plus d'attribuer la partie esclave? Est-ce qu'il fournit une sorte d'intelligence "ou le terminal émulé (xterm par exemple) a toute l'intelligence de se comporter comme un terminal?
/dev/ptmx
n'allocie pas la partie esclave : elle alloue la "Pseudo Terminal Master Part"./dev/ptmx n'est pas le Master pseudo terminal: C'est un Pseudo Terminal Master Multiplexer. Il a été créé avec la norme UNIX98 PTY pour éviter les conditions de raquette lors de l'allocation de Master Pseudo Terminal ( Source ).
La partie principale (PTM) du terminal pseudo n'est pas représenté sur le système de fichiers. Il est représenté par un descripteur de fichier.
La partie esclave (pts) est représentée par un fichier dans /dev/pts/N
Où N
est un nombre.
Le PTS est obtenu à partir du PTM par l'appel successif de grandpt
, unlockpt
, ptsname
. (- Source )
Le PTM remplace le pilote d'Aur dédié à la communication avec l'appareil et à l'édition de la ligne. Donc, il n'en imit en aucune manière un terminal mais fournit la fonctionnalité de édition de ligne et fournissez un moyen de visualiser et de communiquer avec PTS. ( Source )
Voici un graphique de ce qui était un TTY connecté à un périphérique matériel
Et voici un graphique d'un TTY connecté à un PTM
Le fichier PTM gère différents arguments IOCTL (ISPTM, Controkpt, Tiocremote, Tiocsignal) que le PTS.
Pourquoi Xterm doit-il interagir avec la partie principale, car il ne transmet que le stdout et le stdin de la partie esclave? Pourquoi ne peut-il pas écrire directement et lire dans le fichier PTS?
Les processus interagissent avec des périphériques via des actions effectuées dans un fichier virtuel (lecture, écriture, ioctl ..). Le fichier lui-même n'existe pas et le pilote utilise le fichier pour déclencher des actions lorsque des méthodes de lecture ou d'écriture sont appelées. (Voir annexe pour plus d'informations sur les pilotes)
Un TTY définit un moyen précis d'interagir avec elle. Les processus écrivent et lisent de l'appareil et attendent du même comportement quel que soit le type de TTY mis en œuvre.
Les pts se comportent comme un pilote TTY. Sa méthode de lecture et d'écriture est utilisée pour implémenter le comportement du pilote TTY. Comme il n'y a pas d'appareil réel pour envoyer les données, une paire de flux est créée et la PTM implémente une fonction de lecture pour lire les données envoyées par PTS au flux et une fonction d'écriture pour envoyer des données au flux qui seront disponibles. quand le PTS le lira.
N'oubliez pas que le fichier représentant un périphérique n'est pas un fichier classique, et si xterm
veut voir ce qui a été écrit dans le fichier, il ne peut pas simplement appeler simplement ouvert et la lire, car ces fonctions ont un comportement complètement différent. ici.
A un identifiant de session toujours attaché à un fichier PTS et vice versa? Puis-je taper une commande PS et trouver 2 sessionID pour le même/dev/pts/x?
Je ne le pense pas, l'ID de la session est défini par le premier processus qui attache le PTS (Bash généralement), et je ne vois pas un moyen de créer une autre session et de la joindre aux mêmes pts. Peut-être qu'un outil comme socat
pourrait faire cela?
Quelles autres informations le PTS stocke-t-il? Xterm met-il à jour tous les champs par lui-même ou le PTM a-t-il ajouté une "intelligence"?
Le PTS Store 2 catégories d'informations concernant le terminal Il communique avec: le Terminfo
et le Termcap
. Habituellement, de nombreux émulateurs de terminal sont basés sur la bibliothèque qui gèrent les informations de TermCap pour eux (qui fourniront toutes les valeurs de capacités pour émuler un VTX100 par exemple). Un exemple d'une telle bibliothèque est Libvte . Modifier (Commentaire SeeStephane Chazelas): Les capacités de terminal ne sont pas stockées par la PTS.
Voici un schéma que j'ai fait il y a quelque temps sur la façon dont sshd
fonctionne. Cela ne concerne pas le fonctionnement de la discipline et des trucs de ligne, mais il ajoute une illustration de la vie réelle de qui interagit avec quoi:
man pts
dit:
Le fichier/dev/ptmx est un fichier de caractères avec le nombre majeur 5 et le nombre mineur 2, généralement en mode 0666 et propriétaire.groupe de root.root. Il est utilisé pour créer un maître pseudo-terminal et une paire esclave.
Lorsqu'un processus s'ouvre/dev/ptmx, il reçoit un descripteur de fichier pour un pseudo-terminal maître (PTM) et un périphérique d'esclave pseudo-terminal (PTS) est créé dans le répertoire/dev/pts. Chaque descripteur de fichier obtenu par ouverture/dev/ptmx est un PTM indépendant avec ses propres pts associés, dont le chemin peut être trouvé en passant le descripteur à ptsname (3).
Avant d'ouvrir l'esclave pseudo-terminal, vous devez transmettre le descripteur de fichier de la maîtrise à l'accord (3) et déverrouiller (3).
Une fois que le maître et l'esclave pseudo-terminaux sont ouverts, l'esclave fournit des procédés avec une interface identique à celle d'un terminal réel.
Les données écrites sur l'esclave sont présentées sur le descripteur principal en entrée. Les données écrites dans le maître sont présentées à l'esclave comme entrée.
En pratique, les pseudo-terminaux sont utilisés pour la mise en œuvre des émulateurs de terminaux tels que Xterm (1), dans lequel les données lues à partir du pseudo-terminal maître sont interprétées par l'application de la même manière qu'un vrai terminal interpréterait les données et pour la mise en œuvre de la télécommande. -Les programmes SSHD (8), dans lesquels les données lues à partir du pseudo-terminal maître sont envoyées sur le réseau à un programme client connecté à un émulateur terminal ou terminal.
Les pseudo-terminaux peuvent également être utilisés pour envoyer une entrée aux programmes qui refusent normalement de lire les entrées des tuyaux (tels que Su (8) et Passwd (8)).
À propos de /dev/pts/X indexing
:
chaque X est une session que vous l'ouvrez, afin que les esclaves doivent indexer.
À propos de TeteType (/dev/ttyN
):
C'est une vraie console a été générée par votre système de démarrage tel que sysV
.
sur pourquoi l'esclave a été inséré de maître:http://commons.wikimedia.org/wiki/file:ttermios-script-diagram.png