Inseriti altri valori per i flag di controllo dei terminali
[gapil.git] / session.tex
index b2115ac173a167856399ca84616c0d6cc062f59e..61e9908b5ffd6dab8c0dc81006bac4e268aa9823 100644 (file)
@@ -1,13 +1,18 @@
- \chapter{Sessioni di lavoro e terminali}
+\chapter{Terminali e sessioni di lavoro}
 \label{cha:session}
 
 \label{cha:session}
 
-Esamineremo in questo capitolo i concetti base del sistema delle sessioni di
-lavoro, vale a dire il metodo con cui il kernel gestisce l'accesso concorrente
-al sistema da parte di più utenti, permettendo loro di eseguire più programmi
-in contemporanea.  Nella seconda parte del capitolo tratteremo poi il
-funzionamento dell'I/O su terminale, e delle varie peculiarità che esso viene
-ad assumere a causa del suo stretto legame con le modalità di accesso al
-sistema da parte degli utenti.
+I terminali per lungo tempo tempo sono stati l'unico modo per accedere al
+sistema, per questo anche oggi che esistono molte altre interfacce, essi
+continuano a coprire un ruolo particolare, restando strettamente legati al
+funzionamento dell'interfaccia a linea di comando.
+
+Mella prima parte del capitolo esamineremo i concetti base del sistema delle
+sessioni di lavoro, vale a dire il metodo con cui il kernel permette ad un
+utente di gestire le capacità multitiasking del sistema, permettendo di
+eseguire più programmi in contemporanea.  Nella seconda parte del capitolo
+tratteremo poi il funzionamento dell'I/O su terminale, e delle varie
+peculiarità che esso viene ad assumere a causa del suo stretto legame con il
+suo uso come interfaccia di accesso al sistema da parte degli utenti.
 
 
 \section{Il \textit{job control}}
 
 
 \section{Il \textit{job control}}
@@ -490,11 +495,7 @@ Un terminale, che esso sia un terminale effettivo, attaccato ad una seriale o
 ad un altro tipo di porta di comunicazione, o una delle console virtuali
 associate allo schermo, viene sempre visto attraverso attraverso un device
 driver che ne presenta un'interfaccia comune su un apposito file di
 ad un altro tipo di porta di comunicazione, o una delle console virtuali
 associate allo schermo, viene sempre visto attraverso attraverso un device
 driver che ne presenta un'interfaccia comune su un apposito file di
-dispositivo. Storicamente i primi terminali erano appunto terminali di
-telescriventi (\textit{teletype}), da cui deriva sia il nome dell'interfaccia,
-\textit{tty}, che quello dei relativi file di dispositivo, che sono sempre
-della forma \texttt{/dev/tty*}.\footnote{questo vale anche per i terminali
-  virtuali associati alle connessioni di rete con \cmd{telnet} o \cmd{ssh}.}
+dispositivo.
 
 Per controllare un terminale si usa di solito il programma \cmd{getty} (od una
 delle sue varianti), che permette di mettersi in ascolto su uno di questi
 
 Per controllare un terminale si usa di solito il programma \cmd{getty} (od una
 delle sue varianti), che permette di mettersi in ascolto su uno di questi
@@ -678,12 +679,16 @@ messaggi del kernel.\footnote{i messaggi del kernel sono tenuti in un buffer
   si trova in \cite{LinDevDri}, nel quarto capitolo.}
 
 Il servizio permette poi di trattare i vari messaggi classificandoli
   si trova in \cite{LinDevDri}, nel quarto capitolo.}
 
 Il servizio permette poi di trattare i vari messaggi classificandoli
-attraverso due indici; il primo, chiamato \textit{facility}, indica quale
-categoria di demone ha emesso il messaggio, ed è organizzato in sottosistemi
-(kernel, posta elettronica, demoni di stampa, ecc.), il secondo, chiamato
-\textit{priority}, identifica l'importanza del messaggio. Il sistema di
-\textit{syslog} provvede poi a riportare i messaggi all'amministratore
-attraverso differenti meccanismi come:
+attraverso due indici; il primo, chiamato \textit{facility}, suddivide in
+diverse categorie i vari demoni in modo di raggruppare i messaggi provenienti
+da operazioni che hanno attinenza fra loro, ed è organizzato in sottosistemi
+(kernel, posta elettronica, demoni di stampa, ecc.). Il secondo, chiamato
+\textit{priority}, identifica l'importanza dei vari messaggi, e permette di
+classificarli e differenziare le modalità di notifica degli stessi.
+
+Il sistema di \textit{syslog} attraverso \cmd{syslogd} provvede poi a
+riportare i messaggi all'amministratore attraverso una serie differenti
+meccanismi come:
 \begin{itemize*}
 \item scrivere sulla console.
 \item inviare via mail ad uno specifico utente.
 \begin{itemize*}
 \item scrivere sulla console.
 \item inviare via mail ad uno specifico utente.
@@ -697,10 +702,10 @@ dettagli si possono trovare sulle pagine di manuale per questo file e per
 \cmd{syslogd}).
 
 Le \acr{glibc} definiscono una serie di funzioni standard con cui un processo
 \cmd{syslogd}).
 
 Le \acr{glibc} definiscono una serie di funzioni standard con cui un processo
-può accedere in maniera generica al servizio di syslog, che però funzionano
-solo localmente; se si vogliono inviare i messaggi ad un'altro sistema occorre
-farlo esplicitamente con un socket UDP, o utilizzare le capacità di reinvio
-del servizio.
+può accedere in maniera generica al servizio di \textit{syslog}, che però
+funzionano solo localmente; se si vogliono inviare i messaggi ad un'altro
+sistema occorre farlo esplicitamente con un socket UDP, o utilizzare le
+capacità di reinvio del servizio.
 
 La prima funzione definita dall'interfaccia è \func{openlog}, che apre una
 connessione al servizio di \textit{syslog}; essa in generale non è necessaria
 
 La prima funzione definita dall'interfaccia è \func{openlog}, che apre una
 connessione al servizio di \textit{syslog}; essa in generale non è necessaria
@@ -720,35 +725,42 @@ specificato da \code{argv[0]}); la stringa verr
 messaggio. Si tenga presente che il valore di \param{ident} che si passa alla
 funzione è un puntatore, se la stringa cui punta viene cambiata lo sarà pure
 nei successivi messaggi, e se viene cancellata i risultati potranno essere
 messaggio. Si tenga presente che il valore di \param{ident} che si passa alla
 funzione è un puntatore, se la stringa cui punta viene cambiata lo sarà pure
 nei successivi messaggi, e se viene cancellata i risultati potranno essere
-impredicibili, per questo è sempre opportuno usare una stringa costante. Il
-parametro \param{facility} permette invece di specificare l'omonimo indice per
-la categoria del messaggio; i valori possibili sono riportati in
-\tabref{tab:sess_syslog_facility}.
+impredicibili, per questo è sempre opportuno usare una stringa costante. 
+
+L'argomento \param{facility} permette invece di preimpostare per le successive
+chiamate l'omonimo indice che classifica la categoria del messaggio.
+L'argomento è interpretato come una maschera binaria, e pertanto è possibile
+inviare i messaggi su più categorie alla volta; i valori delle costanti che
+identificano ciascuna categoria sono riportati in
+\tabref{tab:sess_syslog_facility}, il valore di \param{facility} deve essere
+specificato con un OR aritmetico.
 
 \begin{table}[htb]
 
 \begin{table}[htb]
-\centering
-\begin{tabular}[c]{|l|p{8cm}|}
-\hline
-\textbf{Valore}& \textbf{Significato}\\
-\hline
-\hline
-\macro{LOG\_AUTH}     & Messaggi relativi ad autenticazione e sicurezza,
-                        obsoleto, è sostituito da \macro{LOG\_AUTHPRIV}. \\
-\macro{LOG\_AUTHPRIV} & Sostituisce \macro{LOG\_AUTH}.\\
-\macro{LOG\_CRON}     & Messaggi dei demoni di gestione dei comandi
-                        programmati (\cmd{cron} e \cmd{at}).\\
-\macro{LOG\_DAEMON}   & Demoni di sistema.\\
-\macro{LOG\_FTP}      & Server FTP.\\
-\macro{LOG\_KERN}     & Messaggi del kernel\\
-\macro{LOG\_LOCAL0}   & Riservato all'amministratore per uso locale\\
---- & \\
-\macro{LOG\_LOCAL7}   & Riservato all'amministratore per uso locale\\
-\macro{LOG\_LPR}      & Messaggi del sistema di gestione delle stampanti \\
-\macro{LOG\_MAIL}     & Messaggi del sistema di posta elettronica\\
-\macro{LOG\_NEWS}     & Messaggi del sistema di gestione delle news (USENET) \\
-\macro{LOG\_SYSLOG}   & Messaggi generati dallo stesso \cmd{syslogd}\\
-\macro{LOG\_USER}     & Messaggi generici a livello utente\\
-\macro{LOG\_UUCP}     & Messaggi del sistema UUCP\\
+  \footnotesize
+  \centering
+  \begin{tabular}[c]{|l|p{8cm}|}
+    \hline
+    \textbf{Valore}& \textbf{Significato}\\
+    \hline
+    \hline
+    \macro{LOG\_AUTH}     & Messaggi relativi ad autenticazione e sicurezza,
+                            obsoleto, è sostituito da \macro{LOG\_AUTHPRIV}. \\
+    \macro{LOG\_AUTHPRIV} & Sostituisce \macro{LOG\_AUTH}.\\
+    \macro{LOG\_CRON}     & Messaggi dei demoni di gestione dei comandi
+                            programmati (\cmd{cron} e \cmd{at}).\\
+    \macro{LOG\_DAEMON}   & Demoni di sistema.\\
+    \macro{LOG\_FTP}      & Server FTP.\\
+    \macro{LOG\_KERN}     & Messaggi del kernel\\
+    \macro{LOG\_LOCAL0}   & Riservato all'amministratore per uso locale\\
+    --- & \\
+    \macro{LOG\_LOCAL7}   & Riservato all'amministratore per uso locale\\
+    \macro{LOG\_LPR}      & Messaggi del sistema di gestione delle stampanti \\
+    \macro{LOG\_MAIL}     & Messaggi del sistema di posta elettronica\\
+    \macro{LOG\_NEWS}     & Messaggi del sistema di gestione delle news 
+                            (USENET) \\
+    \macro{LOG\_SYSLOG}   & Messaggi generati dallo stesso \cmd{syslogd}\\
+    \macro{LOG\_USER}     & Messaggi generici a livello utente\\
+    \macro{LOG\_UUCP}     & Messaggi del sistema UUCP\\
 \hline
 \end{tabular}
 \caption{Valori possibili per l'argomento \param{facility} di \func{openlog}.}
 \hline
 \end{tabular}
 \caption{Valori possibili per l'argomento \param{facility} di \func{openlog}.}
@@ -762,6 +774,7 @@ con un OR aritmetico di una qualunque delle costanti riportate in
 \tabref{tab:sess_openlog_option}.
 
 \begin{table}[htb]
 \tabref{tab:sess_openlog_option}.
 
 \begin{table}[htb]
+  \footnotesize
 \centering
 \begin{tabular}[c]{|l|p{8cm}|}
 \hline
 \centering
 \begin{tabular}[c]{|l|p{8cm}|}
 \hline
@@ -802,36 +815,46 @@ differenza 
 restituita da \code{strerror(errno)}. Gli argomenti seguenti i primi due
 devono essere forniti secondo quanto richiesto da \func{format}.
 
 restituita da \code{strerror(errno)}. Gli argomenti seguenti i primi due
 devono essere forniti secondo quanto richiesto da \func{format}.
 
-L'argomento \param{priority} permette invece di impostare l'importanza del
-messaggio; il valore deve essere impostato i valori possibili sono riportati
-in \secref{tab:sess_syslog_priority}.
+L'argomento \param{priority} permette di impostare sia la \textit{facility}
+che la \textit{priority} del messaggio. In realtà viene prevalentemente usato
+per specificare solo quest'ultima in quanto la prima viene di norma
+preimpostata con \func{openlog}. La priorità è indicata con un valore
+numerico\footnote{le \acr{glibc}, seguendo POSIX.1-2001, prevedono otto
+  diverse priorità ordinate da 0 a 7, in ordine di importanza decrescente;
+  questo comporta che i tre bit meno significativi dell'argomento
+  \param{priority} sono occupati da questo valore, mentre i restanti bit più
+  significativi vengono usati per specificare la \textit{facility}.}
+specificabile attraverso le costanti riportate in
+\secref{tab:sess_syslog_priority}.  Nel caso si voglia specificare anche la
+\textit{facility} basta eseguire un OR aritmetico del valore della priorità
+con la maschera binaria delle costanti di \tabref{tab:sess_syslog_facility}.
 
 \begin{table}[htb]
 
 \begin{table}[htb]
-\centering
-\begin{tabular}[c]{|l|p{8cm}|}
-\hline
-\textbf{Valore}& \textbf{Significato}\\
-\hline
-\hline
-\macro{LOG\_EMERG}   & Il sistema è inutilizzabile. \\
-\macro{LOG\_ALERT}   & C'è una emergenza che richiede intervento immediato.\\
-\macro{LOG\_CRIT}    & Si è in una condizione critica.\\
-\macro{LOG\_ERR}     & Si è in una condizione di errore.\\
-\macro{LOG\_WARNING} & Messaggio di avvertimento.\\
-\macro{LOG\_NOTICE}  & Notizia significativa relativa al comportamento.\\
-\macro{LOG\_INFO}    & Messaggio informativo. \\
-\macro{LOG\_DEBUG}   & Messaggio di debug.\\
-\hline
-\end{tabular}
-\caption{Valori possibili per l'argomento \param{priority} di \func{syslog}.}
-\label{tab:sess_syslog_priority}
+  \footnotesize
+  \centering
+  \begin{tabular}[c]{|l|p{8cm}|}
+    \hline
+    \textbf{Valore}& \textbf{Significato}\\
+    \hline
+    \hline
+    \macro{LOG\_EMERG}   & Il sistema è inutilizzabile. \\
+    \macro{LOG\_ALERT}   & C'è una emergenza che richiede intervento
+                           immediato.\\
+    \macro{LOG\_CRIT}    & Si è in una condizione critica.\\
+    \macro{LOG\_ERR}     & Si è in una condizione di errore.\\
+    \macro{LOG\_WARNING} & Messaggio di avvertimento.\\
+    \macro{LOG\_NOTICE}  & Notizia significativa relativa al comportamento.\\
+    \macro{LOG\_INFO}    & Messaggio informativo. \\
+    \macro{LOG\_DEBUG}   & Messaggio di debug.\\
+    \hline
+  \end{tabular}
+  \caption{Valori possibili per l'indice di importanza del messaggio da
+    specificare nell'argomento \param{priority} di \func{syslog}.}
+  \label{tab:sess_syslog_priority}
 \end{table}
 
 \end{table}
 
-Dato che in molti programmi 
-
-Il sistema del \textit{syslog} usa la priorità del messaggio per classificare
-gli stessi, è inoltre possibile restringere l'emissione dei messaggi
-attraverso l'uso della funzione \func{setlogmask}, il cui prototipo è:
+Una ulteriore funzione, \func{setlogmask}, permette di filtrare
+preliminarmente i messaggi in base alla loro priorità; il suo prototipo è:
 \begin{prototype}{syslog.h}
 {int setlogmask(int mask)}
 
 \begin{prototype}{syslog.h}
 {int setlogmask(int mask)}
 
@@ -840,14 +863,431 @@ Imposta la maschera dei log al valore specificato.
 \bodydesc{La funzione restituisce il precedente valore.}
 \end{prototype}
 
 \bodydesc{La funzione restituisce il precedente valore.}
 \end{prototype}
 
+Le routine di gestione mantengono per ogni processo una maschera che
+determina quale delle chiamate effettuate a \func{syslog} verrà
+effettivamente registrata. La registrazione viene disabilitata per tutte
+quelle priorità che non rientrano nella maschera; questa viene settata
+usando la macro \code{LOG\_MASK(p)} dove \code{p} è una delle costanti di
+\secref{tab:sess_syslog_priority}. É inoltre disponibile anche la macro
+\code{LOG\_UPTO(p)} che permette di specificare automaticamente tutte le
+priorità fino ad un certo valore.
+
 
 
 \section{L'I/O su terminale}
 \label{sec:sess_terminal_io}
 
 
 
 \section{L'I/O su terminale}
 \label{sec:sess_terminal_io}
 
-Esamineremo in questa sezione le peculiarità dell'I/O eseguito sui terminali,
-tenendo conto delle differenze che quest'ultimi presentano rispetto ai normali
-file su disco.
+Benché come ogni altro dispositivo i terminali siano accessibili come file,
+essi hanno assunto storicamente (essendo stati a lungo l'unico modo di
+accedere al sistema) una loro rilevanza specifica, che abbiamo già avuto modo
+di incontrare nella precedente sezione.
+
+Esamineremo qui le peculiarità dell'I/O eseguito sui terminali, che per la
+loro particolare natura presenta delle differenze rispetto ai normali file su
+disco e agli altri dispositivi.
+
+
+
+\subsection{L'architettura}
+\label{sec:term_design}
+
+I terminali sono una classe speciale di dispositivi a caratteri (si ricordi la
+classificazione di \secref{sec:file_file_types}); un terminale ha infatti una
+caratteristica che lo contraddistingue da un qualunque altro dispositivo, e
+cioè che è destinato a gestire l'interazione con un utente (deve essere cioè
+in grado di fare da terminale di controllo per una sessione), che comporta la
+presenza di ulteriori capacità.
+
+L'interfaccia per i terminali è una delle più oscure e complesse, essendosi
+stratificata dagli inizi dei sistemi Unix fino ad oggi. Questo comporta una
+grande quantità di opzioni e controlli relativi ad un insieme di
+caratteristiche (come ad esempio la velocità della linea) necessarie per
+dispositivi, come i terminali seriali, che al giorno d'oggi sono praticamente
+in disuso.
+
+Storicamente i primi terminali erano appunto terminali di telescriventi
+(\textit{teletype}), da cui deriva sia il nome dell'interfaccia, \textit{TTY},
+che quello dei relativi file di dispositivo, che sono sempre della forma
+\texttt{/dev/tty*}.\footnote{ciò vale solo in parte per i terminali virtuali,
+  essi infatti hanno due lati, un \textit{master}, che può assumere i nomi
+  \file{/dev/pty[p-za-e][0-9a-f]} ed un corrispondente \textit{slave} con nome
+  \file{/dev/tty[p-za-e][0-9a-f]}.}  Oggi essi includono le porte seriali, le
+console virtuali dello schermo, i terminali virtuali che vengono creati come
+canali di comunicazione dal kernel e che di solito vengono associati alle
+connessioni di rete (ad esempio per trattare i dati inviati con \cmd{telnet} o
+\cmd{ssh}).
+
+% In generale tutti i terminali hanno un insieme di funzionalità comuni, che
+% vengono chiamate \textsl{discipline di linea}; esse contraddistinguono le
+% modalità con cui il kernel manipola (ad esempio la reazione ad un carattere di
+% cancellazione per la tastiera, o la gestione della linea tramite PPP o SLIP) i
+% dati grezzi che vengono immessi sul dispositivo; 
+
+L'I/O sui terminali si effettua con le stesse modalità dei file normali: si
+apre il relativo file di dispositivo, e si leggono e scriveno i dati con le
+usuali funzioni di lettura e scrittura, così se apriamo una console virtuale
+avremo che \func{read} leggerà quanto immesso dalla tastiera, mentre
+\func{write} scriverà sullo schermo.  In realtà questo è vero solo a grandi
+linee, perché non tiene conto delle caratteristiche specifiche dei terminali;
+una delle principali infatti è che essi prevedono due modalità di operazione,
+dette rispettivamente \textsl{modo canonico} e \textsl{modo non canonico}, che
+comportano dei comportamenti nettamente diversi.
+
+La modalità preimpostata all'apertura del terminale è quella canonica, in cui
+le operazioni di lettura vengono sempre effettuate assemblando i dati in una
+linea;\footnote{per cui eseguendo una \func{read} su un terminale in modo
+  canonico la funzione si bloccherà, anche se si sono scritti dei caratteri,
+  fintanto che non si preme il tasto di ritorno a capo: a questo punto la
+  linea sarà completa e la funzione ritornerà.} ed in cui alcuni caratteri
+vengono interpretati per compiere operazioni (come la generazione dei segnali
+illustrati in \secref{sec:sig_job_control}), questa di norma è la modalità in
+cui funziona la shell.
+
+Un terminale in modo non canonico invece non effettua nessun accorpamento dei
+dati in linee né li interpreta; esso viene di solito usato dai programmi (gli
+editor ad esempio) che necessitano di poter leggere un carattere alla volta e
+che gestiscono al loro interno i vari comandi.
+
+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 da un driver apposito, la cui struttura generica è
+mostrata in \secref{fig:term_struct}. Ad un terminale sono sempre associate
+due code per gestire l'input e l'output, che ne implementano una
+bufferizzazione\footnote{completamente indipendente dalla eventuale ulteriore
+  bufferizzazione fornita dall'interfaccia standard dei file.} all'interno del
+kernel.
+
+\begin{figure}[htb]
+  \centering \includegraphics[width=13cm]{img/term_struct}
+  \caption{Struttura interna generica di un driver per un terminale.}
+  \label{fig:term_struct}
+\end{figure}
+
+La coda di ingresso mantiene i caratteri che sono stati letti dal terminale ma
+non ancora letti da un processo, la sua dimensione è definita dal parametro di
+sistema \macro{MAX\_INPUT}, che ne specifica il limite minimo, in realtà la
+coda può essere più grande e cambiare dimensione dinamicamente. Se è stato
+abilitato il controllo di flusso in ingresso il driver emette i caratteri di
+STOP e START per bloccare e sbloccare l'ingresso dei dati; altrimenti i
+caratteri immessi oltre le dimensioni massime vengono persi; in alcuni casi il
+driver provvede ad inviare automaticamente un avviso (un carattere di BELL,
+che provoca un beep) sull'output quando si eccedono le dimensioni della coda.
+Se è abilitato il modo canonico i caratteri in ingresso restano nella coda
+fintanto che non viene ricevuto un a capo; un'altra costante,
+\macro{MAX\_CANON}, specifica la dimensione massima di una riga in modo
+canonico.
+
+La coda di uscita è analoga a quella di ingresso e contiene i caratteri
+scritti dai processi ma non ancora inviati al terminale. Se è abilitato il
+controllo di flusso in uscita il driver risponde ai caratteri di START e STOP
+inviati dal terminale. Le dimensioni della coda non sono specificate, ma non
+hanno molta importanza, in quanto qualora esse vengano eccedute il driver
+provvede automaticamente a bloccare la funzione chiamante.
+
+
+
+\subsection{La gestione delle caratteristiche di un terminale}
+\label{sec:term_attr}
+
+
+Data le loro peculiarità, fin dall'inizio si è posto il problema di come
+gestire le caratteristiche specifiche dei terminali; storicamente i vari
+dialetti di Unix hanno utilizzato diverse funzioni, alla fine con POSIX.1, è
+stata effettuata una standardizzazione, unificando le differenze fra BSD e
+System V in una unica interfaccia, che è quella usata dal Linux.
+
+Alcune di queste funzioni prendono come argomento un file descriptor (in
+origine molte operazioni venivano effettuate con \func{ioctl}), ma ovviamente
+possono essere usate solo con file che corrispondano effettivamente ad un
+terminale; questo che può essere verificato utilizzando la funzione
+\func{isatty}, il cui prototipo è:
+\begin{prototype}{unistd.h}{int isatty(int desc)}
+  
+  Controlla se il file descriptor \param{desc} è un terminale.
+  
+\bodydesc{La funzione restituisce 1 se \param{desc} è connesso ad un
+  terminale, 0 altrimenti.}
+\end{prototype}
+
+Un'altra funzione che fornisce informazioni su un terminale è \func{ttyname},
+che permette anche di ottenere il nome del terminale associato ad un file
+descriptor; il suo prototipo è:
+\begin{prototype}{unistd.h}{char *ttyname(int desc)}
+  
+  Restituisce il nome di un terminale.
+  
+   \bodydesc{La funzione restituisce il puntatore alla stringa contenente il
+    nome del terminale associato \param{desc} e \macro{NULL} in caso di
+    errore.}
+\end{prototype}
+
+Si tenga presente che la funzione restituisce un indirizzo di dati statici,
+che pertanto possono essere sovrascritti da successive chiamate. La funzione è
+prevista da POSIX.1, che non definisce \func{isatty}.
+
+I vari attributi vengono mantenuti per ciascun terminale in una struttura
+\var{termios}, (la cui definizione è in \figref{fig:term_termios}), usata
+dalle varie funzioni dell'interfaccia. In \figref{fig:term_termios} si sono
+riportati solo i campi previsti dallo standard POSIX.1, in genere le varie
+implementazioni ne aggiungono degli altri (in Linux e BSD ci sono quelli che
+specificano le velocità della linea) per mantenere ulteriori informazioni.
+
+\begin{figure}[!htb] 
+  \footnotesize \centering
+  \begin{minipage}[c]{15cm}
+    \begin{lstlisting}[labelstep=0]{}
+struct termios {
+    tcflag_t c_iflag;      /* input modes */
+    tcflag_t c_oflag;      /* output modes */
+    tcflag_t c_cflag;      /* control modes */
+    tcflag_t c_lflag;      /* local modes */
+    cc_t c_cc[NCCS];       /* control characters */
+};
+    \end{lstlisting}
+  \end{minipage} 
+  \normalsize 
+  \caption{La struttura \var{termios}, che identifica le proprietà di un
+    terminale.}
+  \label{fig:term_termios}
+\end{figure}
+
+I primi quattro campi sono quattro flag che controllano il comportamento del
+terminale; essi sono realizzati come maschera binaria, pertanto il tipo
+\type{tcflag\_t} è di norma realizzato con un intero senza segno di lunghezza
+opportuna. I valori devono essere specificati bit per bit, avendo cura di non
+modificare i bit su cui non si interviene.
+
+\begin{table}[b!ht]
+  \footnotesize
+  \centering
+  \begin{tabular}[c]{|l|p{13cm}|}
+    \hline
+    \textbf{Valore}& \textbf{Significato}\\
+    \hline
+    \hline
+    \macro{INPCK}  & Abilita il controllo di parità in ingresso. Se non viene
+                     impostato non viene fatto nessun controllo ed i caratteri
+                     vengono passati in input direttamente.\\
+    \macro{IGNPAR} & Ignora gli errori di parità, il carattere viene passato
+                     come ricevuto. Ha senso solo se si è impostato 
+                     \macro{INPCK}.\\
+    \macro{PARMRK} & Controlla come vengono riportati gli errori di parità. Ha 
+                     senso solo se \macro{INPCK} è impostato e \macro{IGNPAR}
+                     no. Se impostato inserisce una sequenza \texttt{0xFF
+                       0x00} prima di ogni carattere che presenta errori di
+                     parità, se non impostato un carattere con errori di
+                     parità viene letto come uno \texttt{0x00}. Se un
+                     carattere ha il valore \texttt{0xFF} e \macro{ISTRIP} 
+                     non è settato, per evitare ambiguità esso viene sempre
+                     riportato come \texttt{0xFF 0xFF}.\\
+    \macro{ISTRIP} & Se impostato i caratteri in input sono tagliati a sette
+                     bit mettendo a zero il bit più significativo, altrimenti 
+                     vengono passati tutti gli otto bit.\\
+    \macro{IGNBRK} & Ignora le condizioni di BREAK sull'input. Una
+                     \textit{condizione di BREAK} è definita nel contesto di
+                     una trasmissione seriale asincrona come una sequenza di
+                     bit nulli più lunga di un byte. \\
+    \macro{BRKINT} & Controlla la reazione ad un BREAK quando
+                     \macro{IGNBRK} non è impostato. Se \macro{BRKINT} è
+                     impostato il BREAK causa lo scarico delle code, 
+                     e se il terminale è il terminale di controllo per un 
+                     gruppo in foreground anche l'invio di \macro{SIGINT} ai
+                     processi di quest'ultimo. Se invece \macro{BRKINT} non è
+                     impostato un BREAK viene letto come un carattere
+                     NUL, a meno che non sia settato \macro{PARMRK}
+                     nel qual caso viene letto come la sequenza di caratteri
+                     \texttt{0xFF 0x00 0x00}.\\
+    \macro{IGNCR}  & Se impostato il carattere di ritorno carrello 
+                     (\textit{carriage return}, \verb|'\r'|) viene scartato 
+                     dall'input. Può essere utile per i terminali che inviano 
+                     entrambi i caratteri di ritorno carrello e a capo 
+                     (\textit{newline}, \verb|'\n'|).  \\
+    \macro{ICRNL}  & Se impostato un carattere di ritorno carrello  
+                     (\verb|'\r'|) sul terminale viene automaticamente 
+                     trasformato in un a capo (\verb|'\n'|) sulla coda di
+                     input. \\
+    \macro{INLCR}  & Se impostato il carattere di a capo
+                     (\verb|'\n'|) viene automaticamente trasformato in un
+                     ritorno carello (\verb|'\r'|).\\
+    \macro{IUCLC}  & Se impostato trasforma i caratteri maiuscoli dal
+                     terminale in minuscoli sull'ingresso (opzione non 
+                     POSIX).\\
+    \macro{IXON}   & Se impostato attiva il controllo di flusso in uscita con i
+                     caratteri di START e STOP. se si riceve
+                     uno STOP l'output viene bloccato, e viene fatto
+                     ripartire solo da uno START, e questi due
+                     caratteri non vengono passati alla coda di input. Se non
+                     impostato i due caratteri sono passati alla coda di input
+                     insieme agli altri.\\
+    \macro{IXANY}  & Se impostato con il controllo di flusso permette a
+                     qualunque carattere di far ripartire l'output bloccato da
+                     un carattere di STOP.\\
+    \macro{IXOFF}  & Se impostato abilita il controllo di flusso in
+                     ingresso. Il computer emette un carattere di STOP per
+                     bloccare l'input dal terminale e lo sblocca con il
+                     carattere START. \\
+    \macro{IMAXBEL}& Se impostato fa suonare il cicalino se si riempie la cosa
+                     di ingresso; in Linux non è implementato e il kernel si
+                     comporta cose se fosse sempre settato (è una estensione
+                     BSD). \\
+    \hline
+  \end{tabular}
+  \caption{Costanti identificative dei vari bit del flag di controllo
+    \var{c\_iflag} delle modalità di input di un terminale.}
+  \label{tab:sess_termios_iflag}
+\end{table}
+
+Il primo flag, mantenuto nel campo \var{c\_iflag}, è flag di input che
+controlla le modalità dell'ingresso dei dati 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 \tabref{tab:sess_termios_iflag}.
+
+\begin{table}[htb]
+  \footnotesize
+  \centering
+  \begin{tabular}[c]{|l|p{13cm}|}
+    \hline
+    \textbf{Valore}& \textbf{Significato}\\
+    \hline
+    \hline
+    \macro{OPOST} & Se impostato i caratteri vengono convertiti opportunamente
+                    per la visulizzazione sul terminale, ad esempio al
+                    carattere di a capo (NL) può venire aggiunto un ritorno
+                    carrello (CR).\\
+    \macro{OCRNL} & Se impostato converte automaticamente il carattere di a
+                    capo (NL) nella coppia ritorno carrello, a capo (CR-LF).\\
+    \macro{OLCUC} & Se impostato trasforma i caratteri minuscoli in caratteri
+                    maiuscoli sull'uscita.\\
+    \macro{ONLCR} & Se impostato converte il carattere di a capo (NL) in
+                    ritorno carrello (CR).\\
+    \macro{ONOCR} & Se impostato converte il ritorno carrello (CR) nella
+                    coppia CR-LF.\\
+    \macro{ONLRET}& Se impostato rimuove dall'output il carattere di ritorno
+                    carrello (CR).\\
+    \macro{OFILL} & Se impostato in caso di ritardo sulla linea invia dei
+                    caratteri di riempimento invece di attendere.\\
+    \macro{OFDEL} & Se impostato il carattere di riempimento è DEL
+                    (\texttt{0x3F}), invece che NUL (\texttt{0x00}).\\
+    \macro{NLDLY} & Maschera per i bit che indicano il ritardo per il
+                    carattere di a capo, i valori possibili sono \macro{NL0} o
+                    \macro{NL1}.\\
+    \macro{CRDLY} & Maschera per i bit che indicano il ritardo per il
+                    carattere ritorno carrello, i valori possibili sono
+                    \macro{CR0}, \macro{CR1}, \macro{CR2}, \macro{CR3}.\\
+    \macro{TABDLY}& Maschera per i bit che indicano il ritardo per il
+                    carattere di tabulazione, i valori possibili sono
+                    \macro{TAB0}, \macro{TAB1}, \macro{TAB2}, \macro{TAB3}.\\
+    \macro{BSDLY} & Maschera per i bit che indicano il ritardo per il
+                    carattere di ritorno indietro (\textit{backspace}), i
+                    valori possibili sono \macro{BS0} o \macro{BS1}.\\
+    \macro{VTDLY} & Maschera per i bit che indicano il ritardo per il
+                    carattere di tabulazione verticale, i valori possibili sono
+                    \macro{VT0} o \macro{VT1}.\\
+    \macro{FFDLY} & Maschera per i bit che indicano il ritardo per il
+                    carattere di pagina nuova (\textit{form feed}), i valori
+                    possibili sono \macro{FF0} o \macro{FF1}.\\
+    \hline
+  \end{tabular}
+  \caption{Costanti identificative dei vari bit del flag di controllo
+    \var{c\_oflag} delle modalità di outputdi un terminale.}
+  \label{tab:sess_termios_oflag}
+\end{table}
+
+
+Il secondo flag, mantenuto nel campo \var{c\_oflag}, è il flag di output che
+controlla le modalità dell'uscita 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
+\tabref{tab:sess_termios_oflag}.
+
+\begin{table}[htb]
+  \footnotesize
+  \centering
+  \begin{tabular}[c]{|l|p{10cm}|}
+    \hline
+    \textbf{Valore}& \textbf{Significato}\\
+    \hline
+    \hline
+    \macro{CBAUD}  & . \\
+    \macro{CBAUDEX}& .\\
+    \macro{CSIZE}  & .\\
+    \macro{CSTOPB} & .\\
+    \macro{CREAD}  & .\\
+    \macro{PARENB} & .\\
+    \macro{PARODD} & . \\
+    \macro{HUPCL}  & .\\
+    \macro{CLOCAL} & .\\
+    \macro{LOBLK}  & .\\
+    \macro{CIBAUD} & .\\
+    \macro{CRTSCTS}& .\\
+    \hline
+  \end{tabular}
+  \caption{Costanti identificative dei vari bit del flag di controllo
+    \var{c\_cflag} delle modalità di controllo di un terminale.}
+  \label{tab:sess_termios_cflag}
+\end{table}
+
+Il terzo flag, \var{c\_cflag}, o flag di controllo è legato al funzionamento
+delle linee seriali permette di impostarne varie caratteristiche, come il
+numero di bit di stop, i settaggi della parità, il funzionamento del controllo
+di flusso; un elenco dei vari bit, del loro significato e delle costanti
+utilizzate per identificarli è riportato in \tabref{tab:sess_termios_cflag}.
+
+
+\begin{table}[htb]
+  \footnotesize
+  \centering
+  \begin{tabular}[c]{|l|p{10cm}|}
+    \hline
+    \textbf{Valore}& \textbf{Significato}\\
+    \hline
+    \hline
+    \macro{ISIG} & . \\
+    \macro{ICANON} & .\\
+    \macro{XCASE} & .\\
+    \macro{ECHO} & .\\
+    \macro{ECHOE} & .\\
+    \macro{ECHOK} & .\\
+    \macro{ECHONL} & . \\
+    \macro{ECHOPRT} & .\\
+    \macro{ECHOKE} & .\\
+    \macro{DEFECHO} & .\\
+    \macro{FLUSHO} & .\\
+    \macro{NOFLSH} & .\\
+    \macro{TOSTOP} & .\\
+    \macro{PENDIN} & .\\
+    \macro{IEXTEN} & .\\
+    \hline
+  \end{tabular}
+  \caption{Costanti identificative dei vari bit del flag di controllo
+    \var{c\_lflag} delle modalità locali di un terminale.}
+  \label{tab:sess_termios_lflag}
+\end{table}
+
+
+Il quarto flag, \var{c\_lflag}, o flag locale, serve per modificare il
+funzionamento dell'interfaccia fra il driver e l'utente, come abilitare l'eco,
+controllare l'emissione dei segnali generati dal terminale, attivare i
+caratteri per il job control; un elenco dei vari bit, del loro significato e
+delle costanti utilizzate per identificarli è riportato in
+\tabref{tab:sess_termios_lflag}.
+
+
+
+
+
+\subsection{Il \textsl{modo canonico}}
+\label{sec:term_canonic_mode}
+
+Il modo canonico 
+
+
+\subsection{Il \textsl{modo non canonico}}
+\label{sec:term_noncanonic_mode}
+
+Il modo non canonico