From edae5086a3e87e3b08505cb2acfb3d001ae38242 Mon Sep 17 00:00:00 2001 From: piccardi Date: Fri, 18 Oct 2024 11:54:21 +0200 Subject: [PATCH] Piccole correzioni e link per openpty e affini --- session.tex | 101 +++++++++++++++++++++++++++++----------------------- 1 file changed, 56 insertions(+), 45 deletions(-) diff --git a/session.tex b/session.tex index beb46bb..7a77919 100644 --- a/session.tex +++ b/session.tex @@ -1352,8 +1352,8 @@ ricevuti impiegandoli opportunamente come comandi o come dati. Per capire le caratteristiche dell'I/O sui terminali occorre esaminare le modalità con cui esso viene effettuato. L'accesso, come per tutti i dispositivi, viene gestito dal kernel, ma per tutti i terminali viene -utilizzata una architettura generica che si è schematizzata in -fig.~\ref{fig:term_struct}. +utilizzata una architettura generica che si è schematizzata in maniera +semplificata in fig.~\ref{fig:term_struct}. Ad ogni terminale sono sempre associate due code per gestire l'input e l'output, che ne implementano una bufferizzazione @@ -1406,8 +1406,9 @@ descriptor che corrispondono ad un terminale, in caso contrario lo standard richiede che venga restituito un errore di \errcode{ENOTTY}. Per evitare l'errore, ed anche semplicemente per verificare se un file -descriptor corrisponde ad un terminale, è disponibile la funzione -\funcd{isatty}, il cui prototipo è: +descriptor corrisponde ad un terminale (cosa che viene fatta da alcuni +programmi quando richiedono l'immissione di una password), è disponibile la +funzione \funcd{isatty}, il cui prototipo è: \begin{funcproto}{ \fhead{unistd.h} @@ -1419,13 +1420,14 @@ descriptor corrisponde ad un terminale, è disponibile la funzione altrimenti, nel qual caso \var{errno} assumerà uno dei valori: \begin{errlist} \item[\errcode{EBADF}] \param{fd} non è un file descriptor valido. - \item[\errcode{EINVAL}] \param{fd} non è associato a un terminale (non - ottempera a POSIX.1-2001 che richiederebbe \errcode{ENOTTY}). + \item[\errcode{ENOTTY}] \param{fd} non è associato a un terminale (alcune + vecchie versioni del kernel restituiscono \errcode{EINVAL} che non + ottempera a POSIX.1-2001). \end{errlist} } \end{funcproto} -Un'altra funzione per avere informazioni su un terminale è \funcd{ttyname}, +Una seconda funzione per avere informazioni su un terminale è \funcd{ttyname}, che permette di ottenere il nome del file di dispositivo del terminale associato ad un file descriptor; il suo prototipo è: @@ -1508,14 +1510,14 @@ essere in grado di aprire il terminale. I vari attributi associati ad un terminale vengono mantenuti per ciascuno di essi in una struttura \struct{termios} che viene usata dalle varie funzioni dell'interfaccia. In fig.~\ref{fig:term_termios} si sono riportati tutti i -campi della definizione di questa struttura usata in Linux; di questi solo i -primi cinque sono previsti dallo standard POSIX.1, ma le varie implementazioni -ne aggiungono degli altri per mantenere ulteriori informazioni.\footnote{la - definizione della struttura si trova in \file{bits/termios.h}, da non +campi della definizione di questa struttura usata in Linux;\footnote{la + definizione della struttura si trova in \file{bits/termios-struct.h}, da non includere mai direttamente; Linux, seguendo l'esempio di BSD, aggiunge i due campi \var{c\_ispeed} e \var{c\_ospeed} per mantenere le velocità delle linee seriali, ed un campo ulteriore, \var{c\_line} per indicare la - disciplina di linea.} + disciplina di linea.} di questi solo i primi quattro flag ed il successivo +\texttt{c\_cc} sono previsti dallo standard POSIX.1, ma le varie +implementazioni ne aggiungono degli altri per mantenere ulteriori informazioni. \begin{figure}[!htb] \footnotesize \centering @@ -1621,26 +1623,28 @@ modificare i bit su cui non si interviene. \end{table} Il primo flag, mantenuto nel campo \var{c\_iflag}, è detto \textsl{flag di - input} e controlla le modalità di funzionamento dell'input dei caratteri sul -terminale, come il controllo di parità, il controllo di flusso, la gestione -dei caratteri speciali; un elenco dei vari bit, del loro significato e delle -costanti utilizzate per identificarli è riportato in -tab.~\ref{tab:sess_termios_iflag}. - -Si noti come alcuni di questi flag (come quelli per la gestione del flusso) -fanno riferimento a delle caratteristiche che ormai sono completamente -obsolete; la maggior parte inoltre è tipica di terminali seriali, e non ha -alcun effetto su dispositivi diversi come le console virtuali o gli -pseudo-terminali usati nelle connessioni di rete. + input} e controlla le modalità con cui viene gestita l'immissione dei +caratteri sul terminale, per funzionalità come il controllo di parità, il +controllo di flusso, la gestione dei caratteri speciali; un elenco dei vari +bit che compongono il flag, del loro significato e delle costanti utilizzate +per identificarli è riportato in tab.~\ref{tab:sess_termios_iflag}. + +Si noti come alcuni di questi flag (come quelli relativi al controllo di +gestione del flusso) fanno riferimento a delle caratteristiche dei terminali +che ormai sono completamente obsolete; la maggior parte inoltre è tipica dei +terminali seriali, e non ha alcun effetto su dispositivi diversi come le +console virtuali sullo schermo o gli pseudo-terminali usati nelle connessioni +di rete. Il secondo flag, mantenuto nel campo \var{c\_oflag}, è detto \textsl{flag di - output} e controlla le modalità di funzionamento dell'output dei caratteri, -come l'impacchettamento dei caratteri sullo schermo, la traslazione degli a -capo, la conversione dei caratteri speciali; un elenco dei vari bit, del loro -significato e delle costanti utilizzate per identificarli è riportato in -tab.~\ref{tab:sess_termios_oflag}, di questi solo \const{OPOST} era previsto -da POSIX.1, buona parte degli altri sono stati aggiunti in POSIX.1-2001, -quelli ancora assenti sono stati indicati esplicitamente. + output} e controlla le modalità con cui viene gestito il funzionamento dei +caratteri scritti sul terminale, come l'impacchettamento dei caratteri sullo +schermo, la traslazione degli a capo, la conversione dei caratteri speciali. +Un elenco dei vari bit, del loro significato e delle costanti utilizzate per +identificarli è stato riportato in tab.~\ref{tab:sess_termios_oflag}, di +questi soltanto \const{OPOST} era previsto da POSIX.1, buona parte degli altri +flag sono stati aggiunti in POSIX.1-2001, quelli ancora assenti sono stati +indicati esplicitamente. \begin{table}[!htb] \footnotesize @@ -1698,17 +1702,19 @@ quelli ancora assenti sono stati indicati esplicitamente. \end{table} Si noti come alcuni dei valori riportati in tab.~\ref{tab:sess_termios_oflag} -fanno riferimento a delle maschere di bit; essi infatti vengono utilizzati per -impostare alcuni valori numerici relativi ai ritardi nell'output di alcuni -caratteri: una caratteristica originaria dei primi terminali su telescrivente, -che avevano bisogno di tempistiche diverse per spostare il carrello in -risposta ai caratteri speciali, e che oggi sono completamente in disuso. - -Si tenga presente inoltre che nel caso delle maschere il valore da inserire in -\var{c\_oflag} deve essere fornito avendo cura di cancellare prima tutti i bit -della maschera, i valori da immettere infatti (quelli riportati nella -spiegazione corrispondente) sono numerici e non per bit, per cui possono -sovrapporsi fra di loro. Occorrerà perciò utilizzare un codice del tipo: +fanno riferimento non a bit singoli, ma a delle maschere di bit; essi infatti +vengono utilizzati per impostare alcuni valori numerici relativi ai ritardi da +applicare alla scrittura sul terminale di alcuni caratteri: si tratta di una +caratteristica originaria dei primi terminali su telescrivente, che avevano +bisogno di tempistiche diverse per spostare il carrello in risposta ai +caratteri speciali, e che oggi sono completamente in disuso. + +Si tenga presente inoltre che nel caso si utilizzi una di queste maschere di +bit il valore da inserire in \var{c\_oflag} deve essere fornito avendo cura di +cancellare prima tutti i bit della maschera; i valori da immettere infatti +(quelli riportati nella spiegazione corrispondente) sono numerici e non per +bit, per cui possono sovrapporsi fra di loro. Occorrerà perciò utilizzare un +codice del tipo: \includecodesnip{listati/oflag.c} @@ -1911,8 +1917,8 @@ Oltre ai vari flag per gestire le varie caratteristiche dei terminali, impostare i caratteri speciali associati alle varie funzioni di controllo. Il numero di questi caratteri speciali è indicato dalla costante \constd{NCCS}, POSIX ne specifica almeno 11, ma molte implementazioni ne definiscono molti -altri.\footnote{in Linux il valore della costante è 32, anche se i caratteri - effettivamente definiti sono solo 17.} +altri; in Linux il valore della costante è 32, anche se i caratteri +effettivamente definiti sono solo 17. \begin{table}[!htb] \footnotesize @@ -2187,7 +2193,8 @@ velocità tipiche delle linee seriali: \begin{verbatim} B0 B50 B75 B110 B134 B150 B200 B300 B600 B1200 B1800 B2400 B4800 B9600 - B19200 B38400 B57600 B115200 B230400 B460800 + B19200 B38400 B57600 B115200 B230400 B460800 B460800 + B500000 B576000 B921600 B1000000 B1152000 B1500000 B2000000 \end{verbatim} Un terminale può utilizzare solo alcune delle velocità possibili, le funzioni @@ -2489,7 +2496,6 @@ Da fare. Qui vanno spiegati i terminali virtuali, \file{/dev/pty} e compagnia. % vedi man pts -% vedi \subsection{Allocazione dei terminali virtuali} @@ -2503,6 +2509,11 @@ Qui vanno le cose su \func{openpty} e compagnia. % vedi http://lwn.net/Articles/688809/, % http://man7.org/linux/man-pages/man3/ptsname.3.html +% vedi +% https://stackoverflow.com/questions/77231881/how-to-turn-a-pty-shell-into-a-remote-shell +% https://gist.github.com/zmwangx/2bac2af9195cad47069419ccd9ee98d8 +% https://www.uninformativ.de/blog/postings/2018-02-24/0/POSTING-en.html +% https://cpp.hotexamples.com/it/examples/-/-/openpty/cpp-openpty-function-examples.html % TODO materiale sulle seriali % vedi http://www.easysw.com/~mike/serial/serial.html -- 2.30.2