+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}.
+
+Si tenga presente che i flag che riguardano le modalità di eco dei caratteri
+(\macro{ECHOE}, \macro{ECHOPRT}, \macro{ECHOK}, \macro{ECHOKE},
+\macro{ECHONL}) controllano solo il comportamento della visualizzazione, il
+riconoscimento dei vari caratteri dipende dalla modalità di operazione, ed
+avviene solo in modo canonico, pertanto questi flag non hanno significato se
+non è impostato \macro{ICANON}.
+
+Con i terminali odierni l'unico flag con cui probabilmente si può avere a che
+fare è questo, che è l'unico che concerne le caratteristiche generiche comuni
+a tutti i terminali.
+
+Per impostare tutti questi flag lo standard POSIX prevede due funzioni:
+\func{tcgetattr} e \func{tcsetattr}; entrambe prendono come parametro un
+puntatore ad struttura \var{termios} che deve essere oportunamente
+inizializzata, il loro prototipo è:
+\begin{functions}
+ \headdecl{unistd.h}
+ \headdecl{termios.h}
+ \funcdecl{int tcgetattr(int fd, struct termios *termios\_p)}
+ Legge il valore delle impostazioni di un terminale.
+
+ \funcdecl{int tcsetattr(int fd, int optional\_actions, struct termios
+ *termios\_p)}
+ Scrive le impostazioni di un terminale.
+
+ \bodydesc{Entrambe le funzioni restituiscono 0 in caso di successo e -1 in
+ caso di errore, nel qual caso \var{errno} assumerà i valori:
+ \begin{errlist}
+ \item[\macro{EINTR}] La funzione è stata interrotta.
+ \end{errlist}
+ ed inoltre \macro{EBADF}, \macro{ENOTTY} ed \macro{EINVAL}.
+ }
+\end{functions}
+
+Le funzioni operano sul terminale identificato dal file descriptor \param{fd}
+utilizzando la struttura specificata dal puntatore \param{termios\_p} per lo
+scambio dei dati. Come già accennato i valori di ciascun bit devono essere
+specificati avendo cura di mantenere intatti gli altri; per questo motivo in
+generale si deve prima leggere il valore corrente delle impostazioni con
+\func{tcgetattr} per poi modificare i valori impostati.
+
+In \figref{fig:term_set_attr} si è riportato il codice delle due funzioni
+\func{SetTermAttr} e \func{UnSetTermAttr} che possono essere usate
+rispettivamente per impostare o rimuovere un qualunque bit di \var{c\_lflag},
+con le dovute precauzioni. Il codice di entrambe le funzioni può essere
+trovato nel file \file{SetTermAttr.c} dei sorgenti allegati.
+
+\begin{figure}[!htb]
+ \footnotesize
+ \begin{lstlisting}{}%
+#include <unistd.h>
+#include <termios.h>
+#include <errno.h>
+
+int SetTermAttr(int fd, tcflag_t flag)
+{
+ struct termios values;
+ int res;
+
+ res = tcgetattr (desc, &values);
+ if (res) {
+ perror("Cannot get attributes");
+ return res;
+ }
+ values.c_lflag |= flag;
+ res = tcsetattr (desc, TCSANOW, &values);
+ if (res) {
+ perror("Cannot set attributes");
+ return res;
+ }
+ return 0;
+}
+int UnSetTermAttr(int fd, tcflag_t flag)
+{
+ struct termios values;
+ int res;
+
+ res = tcgetattr (desc, &values);
+ if (res) {
+ perror("Cannot get attributes");
+ return res;
+ }
+ values.c_lflag &= (~flag);
+ res = tcsetattr (desc, TCSANOW, &values);
+ if (res) {
+ perror("Cannot set attributes");
+ return res;
+ }
+ return 0;
+}
+ \end{lstlisting}
+ \caption{Codice delle funzioni \func{SetTermAttr} e \func{UnSetTermAttr} per
+ impostare o rimuovere uno dei flag di controllo locale del terminale.}
+ \label{fig:term_set_attr}
+\end{figure}
+
+La prima funzione provvede ad impostare il bit specificato dall'argomento
+\param{flag}; prima si leggono i valori correnti (\texttt{\small 10}) con
+\func{tcgetattr}, uscendo con un messaggio in caso di errore (\texttt{\small
+ 11--14}), poi si provvede a impostare solo i bit richiesti (possono essere
+più di uno) con un OR binario (\texttt{\small 15}); infine si scrive il nuovo
+valore modificato con \func{tcsetattr} (\texttt{\small 16}), notificando un
+eventuale errore (\texttt{\small 11--14}) o uscendo normalmente.
+
+La seconda funzione è identica alla prima, solo che in questo caso
+(\texttt{\small 33}) si rimuovono i bit specificati dall'argomento
+\param{flag} usando un AND binario del valore negato.
+
+La funzione \func{tcsetattr} prevede tre diverse modalità di funzionamento,
+specificabili attraverso l'argomento \param{optional\_actions}, che permette
+di stabilire come viene eseguito il cambiamento delle impostazioni del
+terminale, i valori possibili sono riportati in
+\ref{tab:sess_tcsetattr_option}; di norma (come fatto per le due funzioni di
+esempio) si usa sempre \macro{TCSANOW}, le altre opzioni possono essere utili
+qualora si cambino i parametri di output.
+
+\begin{table}[htb]
+ \footnotesize
+ \centering
+ \begin{tabular}[c]{|l|p{8cm}|}
+ \hline
+ \textbf{Valore}& \textbf{Significato}\\
+ \hline
+ \hline
+ \macro{TCSANOW} & Esegue i cambiamenti in maniera immediata. \\
+ \macro{TCSADRAIN}& I cambiamenti vengono eseguiti dopo aver atteso che
+ tutto l'output presente sulle code è stato scritto. \\
+ \macro{TCSAFLUSH}& È identico a \macro{TCSADRAIN}, ma in più scarta
+ tutti i dati presenti sulla coda di input.\\
+ \hline
+ \end{tabular}
+ \caption{Possibili valori per l'argomento \param{optional\_actions} della
+ funzione \func{tcsetattr}.}
+ \label{tab:sess_tcsetattr_option}
+\end{table}
+
+Infine occorre tenere presente che \func{tcsetattr} ritorna con successo anche
+se soltanto uno dei cambiamenti richiesti è stato eseguito. Pertanto se si
+effettuano più cambiamenti è buona norma controllare con una ulteriore
+chiamata a \func{tcgetattr} che essi siano stati eseguiti tutti quanti.
+
+Oltre ai vari flag per gestire le varie caratteristiche dei terminali,
+\var{termios} contiene pure il campo \var{c\_cc} che viene usato per impostare
+i caratteri speciali associati alle varie funzioni di controllo. Il numero di
+questi caratteri speciali è indicato dalla costante \macro{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.}
+
+\begin{table}[htb]
+ \footnotesize
+ \centering
+ \begin{tabular}[c]{|l|c|c|p{9cm}|}
+ \hline
+ \textbf{Indice} & \textbf{Valore}&\textbf{Codice} & \textbf{Funzione}\\
+ \hline
+ \hline
+ \macro{VINTR} &\texttt{0x03}&(\verb|C-c|)& Carattere di interrupt,
+ provoca l'emissione di
+ \macro{SIGINT}. \\
+ \macro{VQUIT} &\texttt{0x1C}&(\verb|C-\|)& Carattere di uscita provoca
+ l'emissione di
+ \macro{SIGQUIT}.\\
+ \macro{VERASE} &\texttt{0x7f}& DEL & Carattere di ERASE, cancella
+ l'ultimo carattere precedente
+ nella linea.\\
+ \macro{VKILL} &\texttt{0x15}&(\verb|C-u|)& Carattere di KILL, cancella
+ l'intera riga.\\
+ \macro{VEOF} &\texttt{0x04}&(\verb|C-d|)& Carattere di
+ \textit{end-of-file}. Causa
+ l'invio del contenuto del
+ buffer di ingresso al
+ processo in lettura anche se
+ non è ancora stato ricevuto
+ un a capo. Se è il primo
+ carattere immesso comporta il
+ ritorno di \func{read} con
+ zero caratteri, cioè la
+ condizione di
+ \textit{end-of-file}.\\
+ \macro{VTIME} & --- & --- & Timeout, in decimi di secondo, per
+ una lettura in modo non canonico. \\
+ \macro{VMIN} & --- & --- & Numero minimo di caratteri per una
+ lettura in modo non canonico.\\
+ \macro{VSWTC} &\texttt{0x00}& NUL & Carattere di switch. Non supportato
+ in Linux.\\
+ \macro{VSTART} &\texttt{0x21}&(\verb|C-q|)& Carattere di START. Riavvia un
+ output bloccato da uno STOP.\\
+ \macro{VSTOP} &\texttt{0x23}&(\verb|C-s|)& Carattere di STOP. Blocca
+ l'output fintanto che non
+ viene premuto un carattere di
+ START.\\
+ \macro{VSUSP} &\texttt{0x1A}&(\verb|C-z|)& Carattere di
+ sospensione. Invia il segnale
+ \macro{SIGTSTP}.\\
+ \macro{VEOL} &\texttt{0x00}& NUL & Carattere di fine riga. Agisce come
+ un a capo, ma non viene scartato ed
+ è letto come l'ultimo carattere
+ nella riga. \\
+ \macro{VREPRINT}&\texttt{0x12}&(\verb|C-r|)& Ristampa i caratteri non
+ ancora letti. \\
+ \macro{VDISCARD}&\texttt{0x07}&(\verb|C-o|)& Non riconosciuto in Linux. \\
+ \macro{VWERASE} &\texttt{0x17}&(\verb|C-w|)& Cancellazione di una parola.\\
+ \macro{VLNEXT} &\texttt{0x16}&(\verb|C-v|)& Carattere di escape, serve a
+ quotare il carattere
+ successivo che non viene
+ interpretato ma passato
+ direttamente all'output. \\
+ \macro{VEOL2} &\texttt{0x00}& NUL & Ulteriore carattere di fine
+ riga. Ha lo stesso effetto di
+ \macro{VEOL} ma può essere un
+ carattere diverso. \\
+ \hline
+ \end{tabular}
+ \caption{Valori dei caratteri di controllo mantenuti nel campo \var{c\_cc}
+ della struttura \var{termios}.}
+ \label{tab:sess_termios_cc}
+\end{table}
+
+
+A ciascuna di queste funzioni di controllo corriponde un elemento del vettore
+\var{c\_cc} che specifica quale è il carattere speciale associato; per
+portabilità invece di essere indicati con la loro posizione numerica, i vari
+elementi vengono indicizzati attraverso delle opportune costanti il cui nome
+corrisponde all'azione ad essi associata. Un elenco completo dei caratteri di
+controllo, con le costanti e delle funzionalità associate è riportato in
+\tabref{tab:sess_termios_cc}, usando quelle definizioni diventa possibile
+assegnare un nuovo carattere di controllo con un codice del tipo: