Sur Lubuntu 18.04, j'exécute un shell dans lxterminal. Son terminal de contrôle est le pseudo-terminal esclave courant :
$ tty
/dev/pts/2
Je voudrais savoir quelles sont les relations entre mon terminal de contrôle actuel /dev/pts/2
et /dev/tty
.
-
/dev/tty
agit comme mon terminal de contrôle actuel/dev/pts/2
:$ echo hello > /dev/tty hello $ cat < /dev/tty world world ^C
-
Mais ils semblent être des fichiers sans rapport, au lieu que l'un soit un lien symbolique
ou un lien physique vers l'autre :$ ls -lai /dev/tty /dev/pts/2 5 crw--w---- 1 t tty 136, 2 May 31 16:38 /dev/pts/2 13 crw-rw-rw- 1 root tty 5, 0 May 31 16:36 /dev/tty
Pour différentes sessions avec différents terminaux de contrôle, si/dev/tty
est garanti d'être leurs terminaux de contrôle. Comment peut-il être
différents terminaux de contrôle, sans être un lien symbolique ou
un lien dur ?
Quelles sont donc leurs relations et leurs différences ? Toute aide est très appréciée !
Ce message provient d'un précédent. Est-ce que la sortie de la commande `tty` et le fichier `/dev/tty` font tous deux référence au terminal de contrôle du processus bash actuel ?
Réponse acceptée :
Le tty
La page de manuel de la section 4 revendique ce qui suit :
Le fichier /dev/tty est un fichier de caractères avec le numéro majeur 5 et le numéro
mineur 0, généralement de mode 0666 et propriétaire.groupe root.tty. C'est un
synonyme de terminal de contrôle d'un processus, le cas échéant.En plus de
ioctl(2)
requêtes prises en charge par le périphérique auquel tty
fait référence, leioctl(2)
demanderTIOCNOTTY
est pris en charge.
TIOCNOTTY
Détachez le processus appelant de son terminal de contrôle.
Si le processus est le leader de la session, alors
SIGHUP
etSIGCONT
les signaux
sont envoyés au groupe de processus de premier plan et tous les processus de la
session en cours perdent leur tty de contrôle.Cet
ioctl(2)
call ne fonctionne que sur les descripteurs de fichiers connectés à /dev/tty . Il est utilisé par les processus démons lorsqu'ils sont invoqués par un
utilisateur sur un terminal. Le processus tente d'ouvrir /dev/tty . Si l'
ouverture réussit, il se détache du terminal en utilisantTIOCNOTTY
, tandis que si l'open échoue, il n'est évidemment pas attaché à un
terminal et n'a pas besoin de se détacher.
Cela expliquerait en partie pourquoi /dev/tty
n'est pas un lien symbolique vers le terminal de contrôle :il prendrait en charge un ioctl
supplémentaire , et il se peut qu'il n'y ait pas de terminal de contrôle (mais un processus peut toujours essayer d'accéder à /dev/tty
). Cependant la documentation est incorrecte :le supplément ioctl
n'est pas seulement accessible via /dev/tty
(voir la réponse de mosvy, qui donne également une explication plus sensée de la nature de /dev/tty
).
/dev/tty
peut représenter différents terminaux de contrôle, sans être un lien, car le pilote qui l'implémente détermine quel est le terminal de contrôle du processus appelant, le cas échéant.
Vous pouvez considérer cela comme /dev/tty
étant le terminal de contrôle, et offrant ainsi des fonctionnalités qui n'ont de sens que pour un terminal de contrôle, alors que /dev/pts/2
etc. sont de simples terminaux, dont l'un peut être le terminal de contrôle d'un processus donné.