web-dev-qa-db-fra.com

Qu'est-ce qui est stocké dans les fichiers / dev / pts et pouvons-nous les ouvrir?

D'après mes connaissances, /dev/pts les fichiers sont créés pour les sessions ssh ou telnet.

77
user2720323

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:

  • Les applications GUI telles que xterm, gnome-terminal, konsole,… transforment les événements du clavier et de la souris en entrée de texte et affichent la sortie graphiquement dans certaines polices.
  • Applications multiplexeurs telles que l'écran et le relais tmux, entrée et sortie depuis et vers un autre terminal, pour découpler les applications en mode texte du terminal réel.
  • Les applications Shell distantes telles que sshd, telnetd, rlogind,… relaient l'entrée et la sortie entre un terminal distant sur le client et un pty sur le serveur.

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.

20
Bruce Ediger

/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.

14
goldilocks