À ma connaissance, les /dev/pts
fichiers sont créés pour des sessions ssh ou telnet.
tty
.
À ma connaissance, les /dev/pts
fichiers sont créés pour des sessions ssh ou telnet.
tty
.
Réponses:
Rien n'est stocké dans /dev/pts
. Ce système de fichiers vit uniquement en mémoire.
Les entrées en /dev/pts
sont des pseudo-terminaux (pty en abrégé). Les noyaux Unix ont une notion générique de terminaux . Un terminal offre aux applications un moyen d’afficher une sortie et de recevoir une entrée via un terminal . Un processus peut avoir un terminal de contrôle - pour une application en mode texte, il interagit avec l'utilisateur.
Les terminaux peuvent être des terminaux matériels («tty», ou «télétype») 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 via un écran et un clavier d'ordinateur ( 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 en écriture, la sortie de ce programme apparaît sur le terminal. Il est courant d’avoir plusieurs programmes qui sortent simultanément sur un terminal, bien que cela puisse être parfois déroutant, car il n’ya aucun moyen de savoir quelle partie de la sortie provient de quel programme. Les processus en arrière-plan qui essaient d'écrire sur leur terminal de contrôle peuvent être automatiquement suspendus par un signal SIGTTOU .
Si un programme ouvre un terminal en 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, un seul programme lit activement 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 ce que le terminal est. Disons que c'est /dev/pts/42
. Dans un shell d'un autre terminal, exécutez echo hello >/dev/pts/42
: la chaîne hello
sera affichée sur l'autre terminal. Maintenant, lancez cat /dev/pts/42
et tapez dans l'autre terminal. Pour supprimer cette cat
commande (ce qui rendra l’autre terminal difficile à utiliser), appuyez sur Ctrl+ C.
L'écriture sur un autre terminal est parfois utile pour afficher une notification. par exemple, la write
commande le fait. La lecture à partir d'un autre terminal n'est normalement pas effectuée.
strace
entrer une lecture de programme, mais c'est tout.
tostop
indicateur tty est défini. Cet indicateur n'est pas défini par défaut. Et je suis corrigé sur la lecture d'un autre ATS. Je l'ai essayé et cela fonctionne, mais c'est lecture par lecture, pas par caractère (si vous êtes assis à l'invite du shell, ils sont identiques à ceux qui lisent un shell à la fois). Il serait peut-être bon de clarifier ce point car c'est ainsi que j'ai interprété votre réponse.
read
appel ne renverra que des caractères consécutifs (ou plutôt des octets, devrais-je dire), mais l'application n'a aucun contrôle sur le nombre d'octets renvoyés par un read
appel. Ce n'est donc pas mieux.
Les fichiers /dev/pts
sont "pseudo-ttys". Ils ressemblent dans une certaine mesure aux canaux nommés, mais ils imitent également les anciens terminaux à connexion série, comme les VT-100. Les pseudo-ttys effectuent le transfert d'octets d'un clavier à un programme et d'un programme à un périphérique de sortie, ce qui semble simple. Mais cela répond à votre question d’explicité: le noyau ne stocke rien /dev/pts/0
par exemple. Seuls les flux d'octets provenant de la sortie standard d'un programme connecté au pseudo-terminal entrent, et les programmes dont le stdin est connecté au même pseudo-terminal lisent ces octets.
Les pseudo-ttys mettent également une couche d'indirection dans ces flux d'octets. Le noyau peut inspecter des octets pour rechercher des valeurs spéciales telles que "Control-C" ou "Control-D" ou "Control-U" (tous configurables, voir man stty
) et envoyer un SIGINT, définir la 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 "rien ne stocke" est un peu faux, mais seulement de quelques kilo-octets.
Le noyau peut inspecter les valeurs d'octets à la sortie et effectuer des opérations telles que transformer une nouvelle ligne (saut de ligne ASCII, LF ou "\n"
) en deux octets, retour-chariot et saut de ligne (CRLF ou "\r\n"
), ou tous les octets nécessaires au matériel d'un terminal série. L'indirection d'un pseudo-terminal permet l'indépendance du matériel.
Les pseudo-terminaux autorisent également tous les ioctl()
appels système "à la vitesse de transmission", "à la parité définie", etc. , et ne font probablement rien avec eux. Cela permet aux programmes qui ont été écrits le jour des VT-100, ADM-3 et Wyse whatevers de continuer à fonctionner sans erreur. Le logiciel, le pilote de périphérique pseudo-ttys, agit comme un 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és de l’époque 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, créées et détruites par le noyau et un démon d’espace utilisateur udevd
.
La plupart des périphériques 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 on en crée une pour les sessions à distance. ils sont également créés lorsque vous ouvrez un terminal à interface graphique locale.
Vous pouvez les ouvrir sous forme de fichiers, même si leur valeur d’utilisation n’est pas très grande. Pour obtenir le /dev/pts
nœud 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
Ensuite, essayez d’utiliser le shell dans / dev / pts / 4. Vous êtes bloqué jusqu'à ce que vous quittiez le cat
côté opposé, mais la plupart de ce que vous tapez sur les pts / 4 passera (par exemple, en essayant "hello world" je me suis retrouvé avec hl
sur les pts / 4 et ello word
sur la cat
console).
Mon hypothèse est que le périphérique reçoit les entrées du shell et les transmet via le système, ce qui explique comment les choses se retrouvent à l'écran - le shell ne traite pas de matériel, mais du système. Essayez strace bash
(et regardez man strace
si vous ne savez pas ce que c'est); vous recevez une série 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 saisie, il existe une lecture à partir d'une entrée standard et une écriture vers une sortie standard. Mais quel est le standard de la coquille connecté à? Maintenant, essayez strace
sur votre terminal graphique - 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 cela strace
est probablement plus cryptique - la mienne a beaucoup de poll()
et recvfrom()
. Je ne vois aucune écriture, mais si vous tirez maintenant l' cat
astuce d'un autre terminal, vous remarquerez que lorsque vous tapez, les touches qui sont lues par cat ne provoquent aucune réponse du tout dans la sortie strace - le terminal n'est pas. t les recevoir. Ainsi, l'application de terminal graphique GUI et le chat sont en concurrence pour lire à partir du même périphérique, dans lequel le shell est sortie.
echo Hello > /dev/pts/1
... Voyez ce qui se passe, c'est votre terminal.