Flag per il controllo del terminale
[gapil.git] / session.tex
index 2deb5d6ed320f96f794317a208431c556496d2fb..82d4ff701fd78d2871cd2aa441a825c885723476 100644 (file)
@@ -1,13 +1,18 @@
- \chapter{Sessioni di lavoro e terminali}
+\chapter{Terminali e sessioni di lavoro}
 \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}}
@@ -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
-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
@@ -677,34 +678,39 @@ messaggi del kernel.\footnote{i messaggi del kernel sono tenuti in un buffer
   \func{printf} usata in user space; una trattazione eccellente dell'argomento
   si trova in \cite{LinDevDri}, nel quarto capitolo.}
 
-Il servizio permette poi di trattare i vari messaggi classificandoli secondo
-due indici, una \textit{facility}, che indica quale categoria di demone ha
-emesso il messaggio, e permette di classificarli per sottosistemi (kernel,
-posta elettronica, demoni di stampa, ecc.), ed una \textit{priority}, che
-identifica l'importanza del messaggio. Il sistema di \textit{syslog} provvede
-poi a riportare i messaggi all'amministratore in varie modalità come:
+Il servizio permette poi di trattare i vari messaggi classificandoli
+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 scriverli sulla console.
-\item inviarli via mail ad uno specifico utente.
-\item scriverli su un file (comunemente detto \textit{log file}).
-\item inviarli ad un altro demone (anche via rete).
-\item scartarli.
+\item scrivere sulla console.
+\item inviare via mail ad uno specifico utente.
+\item scrivere su un file (comunemente detto \textit{log file}).
+\item inviare ad un altro demone (anche via rete).
+\item scartare.
 \end{itemize*}
 secondo le modalità che questo preferisce e che possono essere impostate
 attraverso il file di configurazione \file{/etc/syslog.conf} (maggiori
-dettagli si possono trovare sulle relative pagine di manuale per questo file e
-per \cmd{syslogd}).
+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
-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.
-
-La prima funzione definita dall'interfaccia è \func{openlog}; essa in generale
-non è necessaria per l'uso del servizio, ma permette di impostare alcuni
-valori che controllano gli effetti delle chiamate successive; il suo prototipo
-è: 
+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
+per l'uso del servizio, ma permette di impostare alcuni valori che controllano
+gli effetti delle chiamate successive; il suo prototipo è:
 \begin{prototype}{syslog.h}{void openlog(const char *ident, int option, 
 int facility)}
 
@@ -716,46 +722,599 @@ Apre una connessione al sistema di \textit{syslog}.
 La funzione permette di specificare, tramite \param{ident}, l'identità di chi
 ha inviato il messaggio (di norma si passa il nome del programma, come
 specificato da \code{argv[0]}); la stringa verrà preposta all'inizio di ogni
-messaggio. Il parametro \param{facility} permette invece di specificare una
-categoria per classificare i vari messaggi; i valori possibili sono riportati
-in \tabref{tab:sess_syslog_facility}.
+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. 
+
+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]
+  \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}.}
+\label{tab:sess_syslog_facility}
+\end{table}
 
+L'argomento \param{option} serve invece per controllare il comportamento della
+funzione \func{openlog} e delle modalità con cui le successive chiamate
+scriveranno i messaggi, esso viene specificato come maschera binaria composta
+con un OR aritmetico di una qualunque delle costanti riportate in
+\tabref{tab:sess_openlog_option}.
 
 \begin{table}[htb]
+  \footnotesize
 \centering
 \begin{tabular}[c]{|l|p{8cm}|}
 \hline
 \textbf{Valore}& \textbf{Significato}\\
 \hline
 \hline
-\macro{LOG\_AUTH}     & \\
-\macro{LOG\_AUTHPRIV} & \\
-\macro{LOG\_CRON}     & \\
-\macro{LOG\_DAEMON}   & \\
-\macro{LOG\_FTP}      & \\
-\macro{LOG\_KERN}     & \\
-\macro{LOG\_LOCAL0}   & \\
-...& \\
-\macro{LOG\_LOCAL7}   & \\
-\macro{LOG\_LPR}      & \\
-\macro{LOG\_MAIL}     & \\
-\macro{LOG\_NEWS}     & \\
-\macro{LOG\_SYSLOG}   & \\
-\macro{LOG\_USER}     & \\
-\macro{LOG\_UUCP}     & \\
+\macro{LOG\_CONS}   & Scrive sulla console quando. \\
+\macro{LOG\_NDELAY} & Sostituisce \macro{LOG\_AUTH}.\\
+\macro{LOG\_NOWAIT} & Messaggi dei demoni di gestione dei comandi
+                      programmati (\cmd{cron} e \cmd{at}).\\
+\macro{LOG\_ODELAY} & .\\
+\macro{LOG\_PERROR} & Stampa anche su \file{stderr}.\\
+\macro{LOG\_PID}    & Inserisce nei messaggi il \acr{pid} del processo
+                      chiamante. \\
 \hline
 \end{tabular}
-\caption{Valori possibili per l'argomento \param{facility} di \func{openlog}.}
-\label{tab:sess_syslog_facility}
+\caption{Valori possibili per l'argomento \param{option} di \func{openlog}.}
+\label{tab:sess_openlog_option}
+\end{table}
+
+La funzione che si usa per generare un messaggio è \func{syslog}, dato che
+l'uso di \func{openlog} è ozionale, sarà quest'ultima a provvede a chiamare la
+prima qualora ciò non sia stato fatto (nel qual caso il valore di
+\param{ident} è nullo). Il suo prototipo è:
+\begin{prototype}{syslog.h}
+{void syslog(int priority, const char *format, ...)}
+
+Genera un messaggio di priorità \param{priority}.
+
+\bodydesc{La funzione non restituisce nulla.}
+\end{prototype}
+
+Il comportamento della funzione è analogo quello di \func{printf}, e il valore
+dell'argomento \param{format} è identico a quello descritto nella pagina di
+manuale di quest'ultima (per i valori principali si può vedere la trattazione
+sommaria che se ne è fatto in \secref{sec:file_formatted_io}); l'unica
+differenza è che la sequenza \cmd{\%m} viene rimpiazzata dalla stringa
+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 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]
+  \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}
 
+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)}
+
+Imposta la maschera dei log al valore specificato.
+
+\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}
 
-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}, è 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
+\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} o \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} o \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}, è 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
+\tabref{tab:sess_termios_oflag}.
+
+\begin{table}[htb]
+  \footnotesize
+  \centering
+  \begin{tabular}[c]{|l|p{10cm}|}
+    \hline
+    \textbf{Valore}& \textbf{Significato}\\
+    \hline
+    \hline
+    \macro{CLOCAL} & Se impostato indica che il terminale è connesso in locale
+                     e che le linee di controllo del modem devono venire 
+                     ignorate. Se questo flag non è impostato una chiamata ad
+                     \func{open} per la quale non si sia impostato
+                     \macro{O\_NOBLOCK} si bloccherà finché non si sia
+                     stabilita una connessione con il modem, e se viene
+                     rilevata una disconessione viene inviato un
+                     \macro{SIGHUP} al processo di controllo del terminale. La
+                     lettura su un terminale sconnesso comporta una condizione
+                     di \textit{end of file} e la scrittura un errore di
+                     \macro{EIO}. \\
+    \macro{HUPCL}  & Se è impostato vengono staccate le linee di
+                     connessione del modem quando non resta più nessun
+                     processo che ha un file aperto sul terminale.\\
+    \macro{CREAD}  & Se non è impostato l'input del terminale viene scartato.\\
+    \macro{CSTOPB} & Se impostato vengono usati due bit di stop sulla linea
+                     seriale invece di uno.\\
+    \macro{PARENB} & Se impostato abilita la generazione il controllo di
+                     parità. Se non è impostato i bit di parità non vengono
+                     generati e i caratteri non vengono controllati.\\
+    \macro{PARODD} & Ha senso solo se è impostato \macro{PARENB}. Se impostato
+                     la parità è dispari, altrimenti è pari.\\
+    \macro{CSIZE}  & Maschera per i bit che indicano la dimensione del
+                     carattere, i valori possibili sono
+                    \macro{CS5}, \macro{CS6}, \macro{CS7} e \macro{CS8}.\\
+    \macro{CBAUD}  & Maschera dei bit (4+1) usati per impostare della velocità
+                     della linea (il \textit{baud rate}). In Linux viene 
+                     usato un apposito campo di \var{termios}.\\
+    \macro{CBAUDEX}& Bit aggiuntivo per l'impostazione della velocità della
+                     linea.\\
+    \macro{CIBAUD} & Maschera dei bit della velocità della linea in
+                     ingresso. Analogo a \macro{CBAUD}, anch'esso in Linux è
+                     mantenuto in un apposito campo di \var{termios}. \\
+    \macro{CRTSCTS}& Abilita il controllo di flusso hardware (RTS/CTS).\\
+    \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, mantenuto nel campo \var{c\_cflag}, è detto \textsl{flag di
+  controllo} ed è legato al funzionamento delle linee seriali, permettendo di
+impostarne varie caratteristiche, come il numero di bit di stop, i settaggi
+della parità, il funzionamento del controllo di flusso; esso ha senso solo per
+i terminali connessi a linee seriali. 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{ICANON} & Se impostato il terminale opera in modo canonico,
+                     altrimenti opera in modo non canonico.\\
+    \macro{ECHO}   & Se è impostato viene attivato l'eco dei caratteri in
+                     input sull'output del terminale.\\
+    \macro{ECHOE}  & .\\
+    \macro{ISIG}   & .\\
+    \macro{XCASE}  & .\\
+    \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, mantenuto nel campo \var{c\_lflag}, è detto \textsl{flag
+  locale}, e serve per controllare il funzionamento dell'interfaccia fra il
+driver e l'utente, come abilitare l'eco, gestire i caratteri di controllo e
+l'emissione dei segnali, impostare modo canonico o non canonico; 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