Su Lubuntu 18.04, eseguo una shell in lxterminal. Il suo terminale di controllo è l'attuale pseudoterminale slave:
$ tty
/dev/pts/2
Vorrei sapere quali sono le relazioni tra il mio attuale terminale di controllo /dev/pts/2
e /dev/tty
.
-
/dev/tty
si comporta come il mio attuale terminale di controllo/dev/pts/2
:$ echo hello > /dev/tty hello $ cat < /dev/tty world world ^C
-
Ma sembrano essere file non correlati, invece che uno è un collegamento simbolico
o un hardlink all'altro:$ 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
Per sessioni diverse con terminali di controllo diversi, if/dev/tty
è garantito che siano i loro terminali di controllo. Come può
essere diversi terminali di controllo, senza essere un collegamento simbolico o
hardlink?
Allora quali sono le loro relazioni e differenze? Qualsiasi aiuto è molto apprezzato!
Questo post è originato da uno precedente L'output del comando `tty` e il file `/dev/tty` si riferiscono entrambi al terminale di controllo dell'attuale processo bash?
Risposta accettata:
Il tty
manpage nella sezione 4 afferma quanto segue:
Il file /dev/tty è un file di caratteri con numero maggiore 5 e numero minore
0, solitamente di modalità 0666 e proprietario.group root.tty. È un
sinonimo del terminale di controllo di un processo, se presente.
Oltre a ioctl(2)
richieste supportate dal dispositivo a cui tty
fa riferimento, il ioctl(2)
richiedi TIOCNOTTY
è supportato.
TIOCNOTTY
Stacca il processo di chiamata dal suo terminale di controllo.
Se il processo è il leader della sessione, allora SIGHUP
e SIGCONT
i segnali
vengono inviati al gruppo di processi in primo piano e tutti i processi nella
sessione corrente perdono il controllo tty.
Questo ioctl(2)
call funziona solo su descrittori di file collegati a /dev/tty . Viene utilizzato dai processi daemon quando vengono invocati da un utente
su un terminale. Il processo tenta di aprire /dev/tty . Se l'
open riesce, si stacca dal terminale utilizzando TIOCNOTTY
, mentre se l'apertura fallisce, ovviamente non è collegato a un terminale
e non ha bisogno di staccarsi.
Questo spiegherebbe in parte perché /dev/tty
non è un collegamento simbolico al terminale di controllo:supporterebbe un ulteriore ioctl
e potrebbe non esserci un terminale di controllo (ma un processo può sempre provare ad accedere a /dev/tty
). Tuttavia la documentazione non è corretta:l'aggiunta di ioctl
non è accessibile solo tramite /dev/tty
(vedi la risposta di mosvy, che fornisce anche una spiegazione più sensata per la natura di /dev/tty
).
/dev/tty
può rappresentare diversi terminali di controllo, senza essere un collegamento, perché il driver che lo implementa determina qual è il terminale di controllo del processo chiamante, se presente.
Puoi pensare a questo come a /dev/tty
essendo il terminale di controllo, e quindi offrendo funzionalità che hanno senso solo per un terminale di controllo, mentre /dev/pts/2
ecc. sono terminali semplici, uno dei quali potrebbe essere il terminale di controllo per un determinato processo.