GNU/Linux >> Linux Esercitazione >  >> Linux

Quali sono le responsabilità di ciascun componente pseudo-terminale (pty) (software, lato master, lato slave)?

Sto cercando di capire come funziona un tty (il flusso di lavoro e le responsabilità di ciascun elemento). Ho letto diversi articoli interessanti a riguardo, ma ci sono ancora alcune aree sfocate.

Questo è quello che ho capito finora:

  • Il terminale emulato effettua chiamate di sistema diverse a /dev/ptmx , la parte principale dello pseudo-terminale.
  • La parte master dello pseudo terminale alloca un file in /dev/pts/[0-N] , corrispondente alla porta seriale obsoleta, e ad essa “collega” uno pseudo terminale slave.
  • Lo pseudo terminale slave conserva informazioni come ID sessione, lavoro in primo piano, dimensioni dello schermo.

Ecco le mie domande:

  1. Ha ptmx qualche scopo oltre all'allocazione della parte schiava? Fornisce una sorta di "intelligenza" o il terminale emulato
    (xterm per esempio) ha tutta l'intelligenza per comportarsi come un terminale
    ?
  2. Perché xterm deve interagire con la parte master, poiché inoltra solo lo stdout e lo stdin della parte slave? Perché non può
    scrivere e leggere direttamente dal file pts ?
  3. L'ID di sessione è sempre allegato a un file pts e viceversa?
    Posso digitare un comando ps e trovare 2 sessionId per lo stesso
    /dev/pts/X
    ?
  4. Quali altre informazioni contengono i pts negozio? Xterm aggiorna tutti i campi
    da solo o esegue il ptm aggiungere un po' di "intelligenza" su di esso?

Risposta accettata:

Emulatori di terminale

Il lato master sostituisce la linea (la coppia di fili TX/RX) che va al terminale.

Il terminale visualizza i caratteri che riceve su uno dei fili (alcuni di questi sono caratteri di controllo e gli fanno fare cose come spostare il cursore, cambiare colore...) e invia su un altro filo i caratteri corrispondenti ai tasti digitati.

Emulatori di terminale come xterm non sono diversi tranne per il fatto che invece di inviare e ricevere caratteri sui cavi, leggono e scrivono caratteri sul loro descrittore di file sul lato master. Una volta che hanno generato il terminale slave e hanno avviato la tua shell su quello, non lo toccano più. Oltre a emulare la coppia di fili, xterm può anche modificare alcune delle proprietà della disciplina di linea tramite quel descrittore di file sul lato master. Ad esempio, possono aggiornare gli attributi della dimensione in modo che un SIGWINCH venga inviato alle applicazioni che interagiscono con lo slave pty per notificare loro una dimensione modificata.

A parte questo, c'è poca intelligenza nel terminale/emulatore di terminale.

Ciò che scrivi su un dispositivo terminale (come il pty slave) è ciò che intendi essere visualizzato lì, ciò che leggi da esso è ciò che hai digitato lì, quindi non ha senso che l'emulatore di terminale legga o scriva su quello . Sono quelli dall'altra parte.

La disciplina della linea tty

Gran parte dell'intelligenza rientra nella disciplina tty line . La disciplina di linea è un modulo software (che risiede nel driver, nel kernel) inserito sopra un dispositivo seriale/pty che si trova tra quel dispositivo e la linea/cavo (il lato master per un pty).

Una linea seriale può avere un terminale all'altra estremità, ma anche un mouse o un altro computer per il collegamento in rete. Puoi allegare una disciplina di linea SLIP, ad esempio, per ottenere un'interfaccia di rete sopra un dispositivo seriale (o dispositivo pty), oppure puoi avere un tty disciplina di linea. La disciplina della linea tty è la disciplina della linea predefinita almeno su Linux per i dispositivi seriali e pty. Su Linux, puoi cambiare la disciplina della riga con ldattach .

Puoi vedere l'effetto della disabilitazione della disciplina della linea tty emettendo stty raw -echo (nota che il prompt di bash o altre applicazioni interattive come vi imposta il terminale nella modalità esatta di cui ha bisogno, quindi vuoi usare un'applicazione stupida come cat sperimentare con quello).
Quindi, tutto ciò che viene scritto sul dispositivo terminale slave passa immediatamente al lato master per la lettura di xterm e ogni carattere scritto da xterm sul lato master è immediatamente disponibile per la lettura dal dispositivo slave.

Correlati:come ottenere il completamento di bash per gli alias di comando?

La disciplina della linea è dove l'editor della linea interna del dispositivo terminale è implementato. Ad esempio con stty icanon echo (come è l'impostazione predefinita), quando digiti a , xterm scrive a al maestro, poi la disciplina di linea echi indietro (crea un a disponibile per la lettura da xterm per la visualizzazione), ma non rende nulla disponibile per la lettura sul lato slave. Quindi se digiti backspace, xterm invia un ^? o ^H carattere, la disciplina della riga (come quella ^? o ^H corrisponde a erase impostazione della disciplina di linea) restituisce al master un ^H , space e ^H per xterm per cancellare il a hai appena digitato sul suo schermo e ancora non invia nulla all'applicazione leggendo dal lato slave, aggiorna semplicemente il buffer dell'editor di riga interno per rimuovere quel a hai già digitato.

Quindi, quando premi Invio, xterm invia ^M (CR), che la disciplina di linea converte in input in un ^J (LF) e invia ciò che hai inserito finora per la lettura sul lato slave (un'applicazione che legge su /dev/pts/x riceverà ciò che hai digitato incluso LF, ma non il a dato che l'hai cancellato), mentre sul lato master invia un CR e LF per spostare il cursore alla riga successiva e all'inizio dello schermo.

La disciplina di linea è anche responsabile dell'invio del SIGINT segnale al gruppo di processi in primo piano del terminale quando riceve un ^C personaggio sul lato master ecc.

Molte applicazioni terminali interattive disabilitano la maggior parte delle funzioni di quella linea disciplina per attuarla essi stessi. Ma in ogni caso, attenzione che il terminale (xterm ) ha poco coinvolgimento in questo (tranne mostrare ciò che gli viene detto di mostrare).

E può esserci solo una sessione per processo e per dispositivo terminale. A una sessione può essere collegato un terminale di controllo, ma non è necessario (tutte le sessioni iniziano senza un terminale finché non ne aprono uno). xterm , nel processo che esegue il fork per eseguire la tua shell, in genere creerà una nuova sessione (e quindi si staccherà dal terminale in cui hai lanciato xterm da se presente), apri il nuovo /dev/pts/x si è generato, da quello che collega quel dispositivo terminale alla nuova sessione. Quindi eseguirà la tua shell in quel processo, quindi la tua shell diventerà il leader della sessione. La tua shell o qualsiasi shell interattiva in quella sessione in genere si destreggerà con i gruppi di processi e tcsetpgrp() , per impostare i lavori in primo piano e in background per quel terminale.

Quanto a quali informazioni sono memorizzate da un dispositivo terminale con una disciplina tty (seriale o pty) , in genere è ciò che il stty il comando visualizza e modifica. Tutta la configurazione delle discipline:dimensione dello schermo del terminale, locale, flag di input output, impostazioni per caratteri speciali (come ^C, ^Z…), velocità di input e output (non rilevante per ptys). Ciò corrisponde a tcgetattr() /tcsetattr() funzioni che su Linux mappano al TCGETS /TCSETS ioctls e TIOCGWINSZ /TIOCSWINSZ per le dimensioni dello schermo. Si potrebbe obiettare che l'attuale gruppo di processi in primo piano è un'altra informazione memorizzata nel dispositivo terminale (tcsetpgrp() /tcgetpgrp() , TIOC{G,S}PGRP ioctls) o il buffer di input o output corrente.

Si noti che le informazioni sulle dimensioni dello schermo memorizzate nel dispositivo terminale potrebbero non riflettere la realtà. L'emulatore di terminale in genere lo imposterà (tramite lo stesso ioctl sulla dimensione master) quando la sua finestra viene ridimensionata, ma può perdere la sincronizzazione se un'applicazione chiama ioctl sul lato slave o quando il ridimensionamento non viene trasmesso (nel caso di una connessione ssh che implica un altro pty generato da sshd se ssh ignora il SIGWINCH per esempio). Alcuni terminali possono anche essere interrogati sulla loro dimensione tramite sequenze di escape, quindi un'applicazione può interrogarlo in questo modo e aggiornare la disciplina di linea con tali informazioni.

Correlati:Debian:l'effetto dell'impostazione del bit immutabile sulla partizione /boot?

Per maggiori dettagli, puoi dare un'occhiata a termios e tty_ioctl pagine man su Debian per esempio.

Per giocare con altre discipline di linea:

  1. Emula un mouse con uno pseudo-terminale:

    socat pty,link=mouse fifo:fifosudo inputattach -msc mouse # imposta la disciplina della linea MOUSE e specifica protocolxinput list # vedi il nuovo mouse thereexec 3<> fifoprintf '20712
    
Linux
  1. Quali sono le relazioni tra l'attuale terminale di controllo e `/dev/tty`?

  2. Fedora vs Ubuntu:quali sono le differenze principali?

  3. Quali sono i vantaggi di CloudLinux?

  4. Quali sono le modalità di collegamento di rete in CentOS / RHEL

  5. Quali sono i tipi di server DNS

Padroneggia la riga di comando di Linux

DevOps vs Software Engineer:qual è la differenza?

useradd vs. adduser:quali sono le differenze?

Quali sono le directory di inclusione predefinite di GCC?

Cosa sono gli pseudo terminali (pty/tty)?

Quali sono i vantaggi del Logical Volume Manager