D'après mes connaissances, /dev/pts
les fichiers sont créés pour les sessions ssh ou telnet.
Rien n'est stocké dans /dev/pts
. Ce système de fichiers vit uniquement dans la mémoire.
Entrées dans /dev/pts
sont pseudo-terminaux (pty pour faire court). Les noyaux Unix ont une notion générique de terminaux . Un terminal permet aux applications d'afficher des sorties et de recevoir des entrées via un terminal . Un processus peut avoir un terminal de contrôle - pour une application en mode texte, c'est ainsi qu'il interagit avec l'utilisateur.
Les terminaux peuvent être des terminaux matériels ("tty", abréviation de "teletype") ou des pseudo-terminaux ("pty"). Les terminaux matériels sont connectés via une interface telle qu'un port série (ttyS0
,…) Ou USB (ttyUSB0
,…) Ou sur un écran et un clavier PC (tty1
,…). Les pseudo-terminaux sont fournis par un émulateur de terminal, qui est une application. Certains types de pseudo-terminaux sont:
Si un programme ouvre un terminal pour l'écriture, la sortie de ce programme apparaît sur le terminal. Il est courant d'avoir plusieurs programmes en sortie sur un terminal en même temps, bien que cela puisse être déroutant parfois car il n'y a aucun moyen de dire quelle partie de la sortie provient de quel programme. Les processus d'arrière-plan qui tentent d'écrire sur leur terminal de contrôle peuvent être automatiquement suspendus par un signal SIGTTO .
Si un programme ouvre un terminal pour la lecture, l'entrée de l'utilisateur est transmise à ce programme. Si plusieurs programmes lisent depuis le même terminal, chaque caractère est acheminé indépendamment vers l'un des programmes; ce n'est pas recommandé. Normalement, il n'y a qu'un seul programme lisant activement depuis le terminal à un moment donné; les programmes qui essaient de lire depuis leur terminal de contrôle alors qu'ils ne sont pas au premier plan sont automatiquement suspendus par un signal SIGTTIN .
Pour expérimenter, exécutez tty
dans un terminal pour voir quel est le périphérique du terminal. Disons que c'est /dev/pts/42
. Dans un shell dans un autre terminal, exécutez echo hello >/dev/pts/42
: la chaîne hello
sera affichée sur l'autre terminal. Exécutez maintenant cat /dev/pts/42
et saisissez l'autre terminal. Pour tuer cette commande cat
(qui rendra l'autre terminal difficile à utiliser), appuyez sur Ctrl+C.
Écrire sur un autre terminal est parfois utile pour afficher une notification; par exemple, la commande write
fait cela. La lecture à partir d'un autre terminal ne se fait normalement pas.
Les fichiers dans /dev/pts
Sont des "pseudo-ttys". Ils sont comme des tuyaux nommés dans une certaine mesure, mais ils imitent également les anciens terminaux de connexion série, comme les VT-100. Les pseudo-ttys font le travail de transfert d'octets du clavier au programme, et du programme au périphérique de sortie, ce qui semble simple. Mais cela répond à votre question explicite: le noyau ne stocke rien dans /dev/pts/0
Par exemple. Seuls les flux d'octets provenant de la sortie standard d'un programme connecté au pseudo-tty entrent et les programmes dont le stdin est connecté au même pseudo-tty lisent ces octets.
Les pseudo-ttys mettent également une couche d'indirection dans ces flux d'octets. Le noyau peut inspecter les octets pour des valeurs spéciales comme "Control-C" ou "Control-D" ou "Control-U" (qui sont tous configurables, voir man stty
) Et envoyer un SIGINT, défini en fin de fichier sur stdin, ou effacer une ligne sur l'entrée. Il y a aussi une fonction de mise en mémoire tampon quelque part, donc mon "ne stocke rien" est quelque peu faux, mais seulement de quelques kilo-octets.
Le noyau peut inspecter les valeurs d'octets en sortie et faire des choses comme transformer un saut de ligne (saut de ligne ASCII, LF ou "\n"
) En deux octets, retour chariot et saut de ligne (CRLF ou "\r\n"
), Ou tout autre octet requis par le matériel d'un terminal série. L'indirection d'un pseudo-tty permet l'indépendance par rapport au matériel.
Les pseudo-ttys autorisent également tous les appels système "set baud rate", "set parity" et ainsi de suite ioctl()
, et ne font probablement rien avec eux. Cela permet aux programmes qui ont été réécrits à l'époque des VT-100, ADM-3 et Wyse de continuer à fonctionner sans erreur. Le logiciel, le pilote de périphérique pseudo-ttys, agit comme du matériel.
Les pseudo-ttys peuvent être utilisés par sshd
et telnet
, mais ils sont également utilisés entre un émulateur de terminal (comme xterm
ou rxvt
) et le shell qui s'exécute généralement à l'intérieur du xterm.
Linux et beaucoup d'Unix ont des pseudo-ttys. Le plan 9 ne le fait pas. Les pseudo-ttys sont un peu une relique, laissée du temps des terminaux matériels connectés par câble série.
/dev/
Est un répertoire spécial pour les fichiers de périphérique. Ce sont des abstractions, ce ne sont pas de vrais fichiers sur le disque. Le répertoire est rempli au démarrage et peut être modifié pour refléter les interfaces de périphériques existantes, qui sont créées et détruites par le noyau et un démon de l'espace utilisateur, udevd
.
De nombreux appareils ainsi représentés sont virtuels. Cela inclut les entrées dans /dev/pts
, Qui sont des périphériques de console. C'est pourquoi l'un est créé pour les sessions distantes; ils sont également créés lorsque vous ouvrez un terminal GUI local.
Vous pouvez les ouvrir en tant que fichiers, bien que leur valeur ne soit pas très utile. Pour obtenir le nœud /dev/pts
Auquel votre Shell est connecté, utilisez tty
:
> tty
/dev/pts/4
Maintenant, passez à une autre console et essayez:
> echo "duck!" > /dev/pts/4
Intelligent. Maintenant essaye:
> cat /dev/pts/4
Essayez ensuite d'utiliser le shell dans/dev/pts/4. Vous êtes bloqué jusqu'à ce que vous quittiez le cat
de l'autre côté, mais la plupart de ce que vous tapez sur pts/4 passera (par exemple, en essayant "hello world", je me suis retrouvé avec hl
sur pts/4 et Ello Word
sur la console cat
).
Je suppose ici que le périphérique prend les entrées du shell et les transmet via le système, ce qui est la façon dont les choses finissent à l'écran - le shell ne traite pas du matériel, le système l'est. Essayez strace bash
(Et consultez man strace
Si vous ne savez pas ce que c'est); vous obtenez une rafale préliminaire d'appels au démarrage de bash. Maintenant, commencez à frapper les touches:
read(0, "h", 1) = 1
rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0
write(2, "h", 1h) = 1
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
read(0, "e", 1) = 1
rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0
write(2, "e", 1e) = 1
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
read(0, "y", 1) = 1
rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0
write(2, "y", 1y) = 1
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
Pour chaque lettre tapée, il y a une lecture depuis l'entrée standard et une écriture vers la sortie standard. Mais à quoi la norme Shell est-elle connectée? Essayez maintenant strace
sur votre terminal GUI - vous devrez trouver le nom si vous ne le connaissez pas, par exemple sur KDE, c'est konsole
, et GNOME a le gnome-terminal
, je crois. La sortie de cette strace
est probablement plus cryptique - la mienne a beaucoup de poll()
et recvfrom()
. Je ne vois aucune écriture, mais si vous tirez maintenant l'astuce cat
d'un autre terminal, vous remarquerez que lorsque vous tapez, les frappes de touches lues par cat ne provoquent aucune réponse dans la sortie strace - le terminal ne les reçoit pas. Ainsi, l'application de terminal graphique et le chat sont en concurrence pour lire à partir du même appareil, dans lequel le shell est en sortie.