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
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}
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 è:
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
\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
\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}
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
\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
Qui vanno spiegati i terminali virtuali, \file{/dev/pty} e compagnia.
% vedi man pts
-% vedi
\subsection{Allocazione dei terminali virtuali}
% 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