Revisione terminali continua, aggiunti alcuni nuovi flag e corrette
authorSimone Piccardi <piccardi@gnulinux.it>
Wed, 10 Aug 2011 16:56:47 +0000 (16:56 +0000)
committerSimone Piccardi <piccardi@gnulinux.it>
Wed, 10 Aug 2011 16:56:47 +0000 (16:56 +0000)
alcune costanti.

listati/SetTermAttr.c
listati/UnSetTermAttr.c
listati/termios.h
session.tex
sources/mydmesg.c

index 41656f24769cea4dbb6a1ed7c957095ccc6b1938..fbec08f444f45b5a338c3a0683e84c0d8804d699 100644 (file)
@@ -1,19 +1,16 @@
 #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) {
+    if (res = tcgetattr(desc, &values)) {
         perror("Cannot get attributes");
         return res;
     }
     values.c_lflag |= flag;
-    res = tcsetattr (desc, TCSANOW, &values);
-    if (res) {
+    if (res = tcsetattr(desc, TCSANOW, &values)) {
         perror("Cannot set attributes");
         return res;
     }
index fbeec7556c426e6f203f6bde19230c749ee7080d..bb9c21b6ea4f29f0ebc451c2e74b9d6cc7fd4f55 100644 (file)
@@ -2,14 +2,12 @@ int UnSetTermAttr(int fd, tcflag_t flag)
 {
     struct termios values;
     int res;
-    res = tcgetattr (desc, &values);
-    if (res) {
+    if (res = tcgetattr(desc, &values)) {
         perror("Cannot get attributes");
         return res;
     }
     values.c_lflag &= (~flag);
-    res = tcsetattr (desc, TCSANOW, &values);
-    if (res) {
+    if (res = tcsetattr(desc, TCSANOW, &values)) {
         perror("Cannot set attributes");
         return res;
     }
index b0be1089611c89c96b0e1d7145a7841b1e658e6d..18957baa736890d8cb0c7f199116694e33cc7af2 100644 (file)
@@ -1,10 +1,10 @@
 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 */
+    tcflag_t c_iflag;      /* input mode flagss */
+    tcflag_t c_oflag;      /* output modes flags */
+    tcflag_t c_cflag;      /* control modes flags */
+    tcflag_t c_lflag;      /* local modes flags */
     cc_t c_line;           /* line discipline */
+    cc_t c_cc[NCCS];       /* control characters */
     speed_t c_ispeed;      /* input speed */
     speed_t c_ospeed;      /* output speed */
 };
index f0827b0202393b650f5e677b4b0cc1cd77648ae0..fdb7683579fc45b18e0a0187a58c451d26f82d87 100644 (file)
@@ -536,7 +536,7 @@ che permetta l'accesso ad un terminale. Uno schema di massima della procedura
 
 \begin{figure}[htb]
   \centering
-  \includegraphics[width=15cm]{img/tty_login}
+  \includegraphics[width=13cm]{img/tty_login}
   \caption{Schema della procedura di login su un terminale.}
   \label{fig:sess_term_login}
 \end{figure}
@@ -1022,16 +1022,19 @@ sistema,\footnote{quello che viene indicato con il parametro di avvio
 vederli anche in caso di blocco totale del sistema (nell'assunzione che la
 console sia collegata).
 
-In particolare la stampa dei messaggi sulla console è controllata con
-\procfile{/proc/sys/kernel/printk} (o dall'equivalente parametro di
-\func{sysctl}) che prevede quattro valori numerici interi: il primo indica la
-priorità di base oltre la quale vengono stampati i messaggi sulla console, il
-secondo la priorità di default assegnata ai messaggi che non ne hanno
-impostata una, il terzo il valore minimo che si può assegnare al primo
-valore,\footnote{quello che può essere usato con una delle operazioni di
+In particolare la stampa dei messaggi sulla console è controllata dal
+contenuto del file \procfile{/proc/sys/kernel/printk} (o con l'equivalente
+parametro di \func{sysctl}) che prevede quattro valori numerici interi: il
+primo (\textit{console\_loglevel}) indica la priorità corrente oltre la quale
+vengono stampati i messaggi sulla console, il secondo
+(\textit{default\_message\_loglevel}) la priorità di default assegnata ai
+messaggi che non ne hanno impostata una, il terzo
+(\textit{minimum\_console\_level}) il valore minimo che si può assegnare al
+primo valore,\footnote{quello che può essere usato con una delle operazioni di
   gestione che vedremo a breve per ``\textsl{silenziare}'' il kernel. } ed il
-quarto come valore di default.\footnote{anch'esso viene usato nelle operazioni
-  di controllo per tornare ad un valore predefinito.}
+quarto (\textit{default\_console\_loglevel}) il valore di
+default.\footnote{anch'esso viene usato nelle operazioni di controllo per
+  tornare ad un valore predefinito.}
 
 Per la lettura dei messaggi del kernel e la gestione del relativo buffer
 circolare esiste una apposita \textit{system call} chiamata anch'essa
@@ -1048,9 +1051,12 @@ Gestisce i messaggi di log del kernel.
   nullo dipendente dall'operazione scelta e $-1$ in caso di errore, nel qual
   caso \var{errno} assumerà i valori:
   \begin{errlist}
-  \item[\errcode{EINVAL}] l'argomento \param{op} non ha un valore valido.
+  \item[\errcode{EINVAL}] l'argomento \param{op} non ha un valore valido, o si
+    sono specificati valori non validi per gli altri argomenti quando questi
+    sono richiesti.
   \item[\errcode{ERESTARTSYS}] l'operazione è stata interrotta da un segnale.
-  \item[\errcode{EPERM}] non si hanno i privilegi richiesti per l'operazione.
+  \item[\errcode{EPERM}] non si hanno i privilegi richiesti per l'operazione
+    richiesta.
   \item[\errcode{ENOSYS}] il supporto per \func{printk} non è stato compilato
     nel kernel.
   \end{errlist}
@@ -1061,11 +1067,10 @@ Gestisce i messaggi di log del kernel.
 La funzione prevede che si passi come primo argomento \param{op} un codice
 numerico che indica l'operazione richiesta, il secondo argomento deve essere,
 per le operazioni che compiono una lettura di dati, l'indirizzo del buffer su
-cui copiarli, mentre il terzo indica la lunghezza del buffer, quando questo è
-richiesto, oppure un valore numerico. L'effettivo uso di questi due argomenti
-dipende comunque dall'operazione richiesta, ma essi devono essere comunque
-specificati, anche quando non servono, nel qual caso verranno semplicemente
-ignorati.
+cui copiarli, ed il terzo quanti leggerne. L'effettivo uso di questi due
+argomenti dipende comunque dall'operazione richiesta, ma essi devono essere
+comunque specificati, anche quando non servono, nel qual caso verranno
+semplicemente ignorati.
 
 \begin{table}[htb]
   \footnotesize
@@ -1094,34 +1099,36 @@ ignorati.
     \texttt{8} & imposta a \param{len} il livello dei messaggi stampati sulla
                  console, \param{buffer} è ignorato.\\ 
     \texttt{9} & ritorna il numero di byte da leggere presenti sul buffer di
-                 log, \param{buffer} e \param{len} sono ignorati.\\
+                 log, \param{buffer} e \param{len} sono ignorati (dal kernel
+                 2.4.10).\\ 
     \texttt{10}& ritorna la dimensione del buffer di log, \param{buffer}
-                 e \param{len} sono ignorati.\\
+                 e \param{len} sono ignorati (dal kernel 2.6.6).\\
 \hline
 \end{tabular}
 \caption{Valori possibili per l'argomento \param{op} di \func{klogctl}.}
 \label{tab:klogctl_operation}
 \end{table}
 
-Si sono riportati i possibili valori di \param{op}, con una breve spiegazione
-della relativa operazione e a come vengono usati gli altri due argomenti, in
-tab.~\ref{tab:klogctl_operation}. Come si può notare la funzione è una sorta
-di interfaccia comune usata per eseguire operazioni completamente diverse fra
-loro.
+Si sono riportati in tab.~\ref{tab:klogctl_operation} i possibili valori
+utilizzabili per \param{op}, con una breve spiegazione della relativa
+operazione e a come vengono usati gli altri due argomenti. Come si può notare
+la funzione è una sorta di interfaccia comune usata per eseguire operazioni
+completamente diverse fra loro.
 
-L'operazione relativa al valore 2 \param{op} consente di leggere un messaggio
-dal cosiddetto \textit{log} del kernel. Eseguire questa operazione è
+L'operazione corrispondente al valore 2 \param{op} consente di leggere un
+messaggio dal cosiddetto \textit{log} del kernel. Eseguire questa operazione è
 equivalente ad eseguire una lettura dal file
-\procfile{/proc/kmsg}:\footnote{in realtà è vero l'opposto, è questa funzione
+\procfile{/proc/kmsg},\footnote{in realtà è vero l'opposto, è questa funzione
   che viene eseguita quando si legge da questo file.} se non vi sono messaggi
 la funzione blocca in attesa di dati e ritorna soltanto quando questi
-diventino disponibili. In tal caso verranno letti \param{len} byte
-su \param{buffer} ed estratti dal log;\footnote{i dati del \textit{log} del
-  kernel cioè si possono leggere una volta sola, se più processi eseguono
-  l'operazione di lettura soltanto uno riceverà i dati, a meno che completata
-  la propria operazione di lettura non restino altri messaggi pendenti che a
-  questo punto potrebbero essere letti da un altro processo in attesa.} il
-valore di ritorno di \func{klogctl} corrisponderà al numero di byte ottenuti.
+diventino disponibili. In tal caso verranno letti ed
+estratti\footnote{estratti in quanti i dati del \textit{log} del kernel si
+  possono leggere una volta sola, se più processi eseguono l'operazione di
+  lettura soltanto uno riceverà i dati, a meno che completata la propria
+  operazione di lettura non restino altri messaggi pendenti che a questo punto
+  potrebbero essere letti da un altro processo in attesa.} dal log \param{len}
+byte che verranno scritti su \param{buffer}; il valore di ritorno di
+\func{klogctl} corrisponderà al numero di byte ottenuti.
 
 Se invece si usa l'operazione 3 i dati vengono letti dal buffer circolare
 usato da \texttt{printk}, che mantiene tutti i messaggi stampati dal kernel
@@ -1130,12 +1137,43 @@ letti più volte. Usando invece l'operazione 4 si richiede, dopo aver fatto la
 lettura, di cancellare il buffer circolare, che risulterà vuoto ad una lettura
 successiva. Anche con queste operazioni \param{len} indica il numero di byte
 da leggere e \param{buffer} il buffer dover leggerli, e la funzione ritorna il
-numero di byte effettivamente letti.
-
-Le operazioni corrispondenti ai valori 6, 7 ed 8 fanno riferimento ai
-parametri del kernel gestiti con \procfile{/proc/sys/kernel/printk}
-
-
+numero di byte effettivamente letti. L'operazione 5 esegue soltanto la
+cancellazione del buffer circolare, \param{len} e \param{buffer} sono ignorati
+e la funzione ritorna un valore nullo.
+
+Le operazioni corrispondenti ai valori 6, 7 ed 8 consentono di modificare la
+priorità oltre la quale i messaggi vengono stampati direttamente sulla
+\textit{console} e fanno riferimento ai parametri del kernel gestiti con le
+variabili contenute in \procfile{/proc/sys/kernel/printk} di cui abbiamo
+parlato prima, ed in particolare con 6 si imposta come corrente il valore
+minimo della terza variabile (\textit{minimum\_console\_level}), ottenendo
+l'effetto di ridurre al minimo i messaggi che arrivano in console, mentre con
+7 si ripristina il valore di default.\footnote{secondo la documentazione
+  questo sarebbe quello indicato della quarta variabile,
+  \textit{default\_console\_loglevel} in genere pari a 7, ma alcune prove con
+  il programma \texttt{mydmesg} che si trova nei sorgenti allegati alla guida
+  rivelano che l'unico effetto di questa operazione è riportare il valore a
+  quello precedente se lo si è ridotto al minimo con l'operazione 6.}  Per
+impostare direttamente un valore specifico infine si può usare 8, nel qual
+caso il valore numerico del livello da impostare deve essere specificato
+con \param{len}, che può assumere solo un valore fra 1 e 8.
+
+Infine le due operazioni 9 e 10 consentono di ottenere rispettivamente il
+numero di byte ancora non letti dal log del kernel, e la dimensione totale di
+questo. Per entrambe i dati sono restituiti come valore di ritorno, e gli
+argomento \param{buffer} e \param{len} sono ignorati.
+
+Si tenga presente che la modifica del livello minimo per cui i messaggi
+vengono stampati sulla console (operazioni 6, 7 e 8) e la cancellazione del
+buffer circolare di \texttt{printk} (operazioni 4 e 5) sono privilegiate; fino
+al kernel 2.6.30 era richiesta la capacità \const{CAP\_SYS\_ADMIN}, a partire
+dal 2.6.38 detto privilegio è stato assegnato ad una capacità aggiuntiva,
+\const{CAP\_SYSLOG}. Tutto questo è stato fatto per evitare che processi
+eseguiti all'interno di un sistema di virtualizzazione ``\textsl{leggera}''
+(come i \textit{Linux Container} di LXC) che necessitano di
+\const{CAP\_SYS\_ADMIN} per operare all'interno del proprio ambiente
+ristretto, potessero anche avere la capacità di influire sui log del kernel
+al di fuori di questo.
 
 \itindend{syslog}
 
@@ -1191,8 +1229,8 @@ 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.
+dette rispettivamente ``\textsl{modo canonico}'' e ``\textsl{modo non
+  canonico}'', che hanno 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
@@ -1201,8 +1239,8 @@ linea;\footnote{per cui eseguendo una \func{read} su un terminale in modo
   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 sez.~\ref{sec:sig_job_control}), questa di norma è la modalità in
-cui funziona la shell.
+illustrata in sez.~\ref{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
@@ -1214,9 +1252,9 @@ 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 fig.~\ref{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.
+bufferizzazione all'interno del kernel.\footnote{completamente indipendente
+  dalla eventuale ulteriore bufferizzazione fornita dall'interfaccia standard
+  dei file.}
 
 \begin{figure}[htb]
   \centering \includegraphics[width=14.5cm]{img/term_struct}
@@ -1251,99 +1289,113 @@ provvede automaticamente a bloccare la funzione chiamante.
 \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.
+gestire le caratteristiche specifiche dei terminali. Storicamente i vari
+dialetti di Unix hanno utilizzato diverse funzioni, ma alla fine con POSIX.1 è
+stata effettuata una standardizzazione unificando le differenze fra BSD e
+System V in una unica interfaccia, che è quella usata da 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 (altrimenti si otterrà un errore di \errcode{ENOTTY}); questo può
-essere evitato utilizzando la funzione \funcd{isatty}, il cui prototipo è:
-\begin{prototype}{unistd.h}{int isatty(int desc)}
+terminale, altrimenti si otterrà un errore di \errcode{ENOTTY}; questo può
+essere evitato utilizzando preventivamente la funzione \funcd{isatty}, il cui
+prototipo è:
+\begin{prototype}{unistd.h}{int isatty(int fd)}
   
-  Controlla se il file descriptor \param{desc} è un terminale.
+  Controlla se il file descriptor \param{fd} è un terminale.
   
-\bodydesc{La funzione restituisce 1 se \param{desc} è connesso ad un
-  terminale, 0 altrimenti.}
+  \bodydesc{La funzione restituisce 1 se \param{fd} è connesso ad un
+    terminale, 0 altrimenti, ed in tal caso \var{errno} potrà assumere i
+    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}).
+  \end{errlist}
+}
 \end{prototype}
 
 Un'altra funzione che fornisce informazioni su un terminale è \funcd{ttyname},
-che permette di ottenere il nome del terminale associato ad un file
-descriptor; il suo prototipo è:
-\begin{prototype}{unistd.h}{char *ttyname(int desc)}
+che permette di ottenere il nome del file di dispositivo del terminale
+associato ad un file descriptor; il suo prototipo è:
+\begin{prototype}{unistd.h}{char *ttyname(int fd)}
   
-  Restituisce il nome del terminale associato al file \param{desc}.
-  
-   \bodydesc{La funzione restituisce il puntatore alla stringa contenente il
-    nome del terminale associato \param{desc} e \val{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. Una funzione
-funzione analoga, anch'essa prevista da POSIX.1, è \funcd{ctermid}, il cui
-prototipo è:
-\begin{prototype}{stdio.h}{char *ctermid(char *s)}
-  
-  Restituisce il nome del terminale di controllo del processo.
+  Restituisce il nome del terminale associato a \param{fd}.
   
   \bodydesc{La funzione restituisce il puntatore alla stringa contenente il
-    \textit{pathname} del terminale.}
+    nome del terminale associato \param{fd} e \val{NULL} in caso di errore,
+    nel qual caso \var{errno} assumerà i valori:
+  \begin{errlist}
+  \item[\errcode{EBADF}] \param{fd} non è un file descriptor valido.
+  \item[\errcode{ENOTTY}] \param{fd} non è associato a un terminale.
+  \end{errlist}
+}
 \end{prototype}
+\noindent ma si tenga presente che la funzione restituisce un indirizzo di
+dati statici, che pertanto possono essere sovrascritti da successive chiamate.
 
-La funzione scrive il \itindex{pathname} \textit{pathname} del terminale di
-controllo del processo chiamante nella stringa posta all'indirizzo specificato
-dall'argomento \param{s}.  La memoria per contenere la stringa deve essere
-stata allocata in precedenza ed essere lunga almeno
-\const{L\_ctermid}\footnote{\const{L\_ctermid} è una delle varie costanti del
-  sistema, non trattata esplicitamente in sez.~\ref{sec:sys_characteristics}
-  che indica la dimensione che deve avere una stringa per poter contenere il
-  nome di un terminale.} caratteri.
-
-Esiste infine una versione \index{funzioni!rientranti} rientrante
-\funcd{ttyname\_r} della funzione \func{ttyname}, che non presenta il problema
-dell'uso di una zona di memoria statica; il suo prototipo è:
-\begin{prototype}{unistd.h}{int ttyname\_r(int desc, char *buff, size\_t len)}
+Della funzione esiste anche una versione \index{funzioni!rientranti}
+rientrante, \funcd{ttyname\_r}, che non presenta il problema dell'uso di una
+zona di memoria statica; il suo prototipo è:
+\begin{prototype}{unistd.h}{int ttyname\_r(int fd, char *buff, size\_t len)}
   
-  Restituisce il nome del terminale associato al file \param{desc}.
+  Restituisce il nome del terminale associato a \param{fd}.
   
   \bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di
     errore, nel qual caso \var{errno} assumerà i valori:
     \begin{errlist}
-    \item[\errcode{ERANGE}] la lunghezza del buffer, \param{len}, non è
+    \item[\errcode{ERANGE}] la lunghezza del buffer \param{len} non è
       sufficiente per contenere la stringa restituita.
     \end{errlist}
-    ed inoltre \errval{EBADF} ed \errval{ENOSYS}.
-}
+    oltre ai precedenti \errval{EBADF} ed \errval{ENOTTY}.  }
+\end{prototype}
+
+La funzione prende due argomenti in più, il puntatore \param{buff} alla zona
+di memoria in cui l'utente vuole che il risultato venga scritto, che dovrà
+essere stata allocata in precedenza, e la relativa dimensione,
+\param{len}. Se la stringa che deve essere restituita, compreso lo zero di
+terminazione finale, eccede questa dimensione si avrà una condizione di
+errore.
+
+Una funzione funzione analoga alle precedenti anch'essa prevista da POSIX.1,
+che restituisce sempre il nome di un file di dispositivo, è \funcd{ctermid},
+il cui prototipo è:
+\begin{prototype}{stdio.h}{char *ctermid(char *s)}
+  
+  Restituisce il nome del terminale di controllo del processo.
+  
+  \bodydesc{La funzione restituisce il puntatore alla stringa contenente il
+    \textit{pathname} del terminale o \val{NULL} se non non riesce ad eseguire
+    l'operazione.}
 \end{prototype}
 
-La funzione prende due argomenti, il puntatore alla zona di memoria
-\param{buff}, in cui l'utente vuole che il risultato venga scritto (dovrà
-ovviamente essere stata allocata in precedenza), e la relativa dimensione,
-\param{len}; se la stringa che deve essere restituita eccede questa dimensione
-si avrà una condizione di errore.
-
-Se si passa come argomento \val{NULL} la funzione restituisce il puntatore ad
-una stringa statica che può essere sovrascritta da chiamate successive. Si
-tenga presente che il \itindex{pathname} \textit{pathname} restituito
-potrebbe non identificare univocamente il terminale (ad esempio potrebbe
-essere \file{/dev/tty}), inoltre non è detto che il processo possa
-effettivamente aprire il terminale.
-
-I vari attributi vengono mantenuti per ciascun terminale in una struttura
-\struct{termios}, (la cui definizione è riportata in
-fig.~\ref{fig:term_termios}), usata dalle varie funzioni dell'interfaccia. In
-fig.~\ref{fig:term_termios} si sono riportati tutti i campi della definizione
-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 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 ... (NdT, trovare a che serve).}
-% TODO trovare a che serve
+La funzione restituisce un puntatore al \textit{pathname} del file di
+dispositivo del terminale di controllo del processo chiamante.  Se si passa
+come argomento \val{NULL} la funzione restituisce il puntatore ad una stringa
+statica che può essere sovrascritta da chiamate successive, e non è
+rientrante. Indicando invece un puntatore ad una zona di memoria già allocata
+la stringa sarà scritta su di essa, ma in questo caso il buffer preallocato
+deve essere di almeno \const{L\_ctermid}\footnote{\const{L\_ctermid} è una
+  delle varie costanti del sistema, non trattata esplicitamente in
+  sez.~\ref{sec:sys_characteristics} che indica la dimensione che deve avere
+  una stringa per poter contenere il nome di un terminale.} caratteri.
+
+Si tenga presente che il \itindex{pathname} \textit{pathname} restituito dalla
+funzione potrebbe non identificare univocamente il terminale (ad esempio
+potrebbe essere \file{/dev/tty}), inoltre non è detto che il processo possa
+effettivamente 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
+  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.}
 
 \begin{figure}[!htb] 
   \footnotesize \centering
@@ -1356,6 +1408,9 @@ ulteriori informazioni.\footnote{la definizione della struttura si trova in
   \label{fig:term_termios}
 \end{figure}
 
+% per le definizioni dei dati vedi anche:
+% http://www.lafn.org/~dave/linux/termios.txt 
+
 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
@@ -1370,9 +1425,20 @@ modificare i bit su cui non si interviene.
     \textbf{Valore}& \textbf{Significato}\\
     \hline
     \hline
-    \const{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.\\
+    \const{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.\\
+    \const{BRKINT} & Controlla la reazione ad un BREAK quando
+                     \const{IGNBRK} non è impostato. Se \const{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 \const{SIGINT} ai
+                     processi di quest'ultimo. Se invece \const{BRKINT} non è
+                     impostato un BREAK viene letto come un carattere
+                     NUL, a meno che non sia impostato \const{PARMRK}
+                     nel qual caso viene letto come la sequenza di caratteri
+                     \texttt{0xFF 0x00 0x00}.\\
     \const{IGNPAR} & Ignora gli errori di parità, il carattere viene passato
                      come ricevuto. Ha senso solo se si è impostato 
                      \const{INPCK}.\\
@@ -1385,23 +1451,15 @@ modificare i bit su cui non si interviene.
                      carattere ha il valore \texttt{0xFF} e \const{ISTRIP} 
                      non è impostato, per evitare ambiguità esso viene sempre
                      riportato come \texttt{0xFF 0xFF}.\\
+    \const{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.\\
     \const{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.\\
-    \const{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.\\
-    \const{BRKINT} & Controlla la reazione ad un BREAK quando
-                     \const{IGNBRK} non è impostato. Se \const{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 \const{SIGINT} ai
-                     processi di quest'ultimo. Se invece \const{BRKINT} non è
-                     impostato un BREAK viene letto come un carattere
-                     NUL, a meno che non sia impostato \const{PARMRK}
-                     nel qual caso viene letto come la sequenza di caratteri
-                     \texttt{0xFF 0x00 0x00}.\\
+    \const{INLCR}  & Se impostato in ingresso il carattere di a capo
+                     (\verb|'\n'|) viene automaticamente trasformato in un
+                     ritorno carrello (\verb|'\r'|).\\
     \const{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 
@@ -1411,9 +1469,6 @@ modificare i bit su cui non si interviene.
                      (\verb|'\r'|) sul terminale viene automaticamente 
                      trasformato in un a capo (\verb|'\n'|) sulla coda di
                      input.\\
-    \const{INLCR}  & Se impostato il carattere di a capo
-                     (\verb|'\n'|) viene automaticamente trasformato in un
-                     ritorno carrello (\verb|'\r'|).\\
     \const{IUCLC}  & Se impostato trasforma i caratteri maiuscoli dal
                      terminale in minuscoli sull'ingresso (opzione non 
                      POSIX).\\
@@ -1435,6 +1490,9 @@ modificare i bit su cui non si interviene.
                      di ingresso; in Linux non è implementato e il kernel si
                      comporta cose se fosse sempre impostato (è una estensione
                      BSD).\\
+    \const{IUTF8}  & Indica che l'input è in UTF-8, cosa che consente di
+                     utilizzare la cancellazione dei caratteri in maniera
+                     corretta (dal kernel 2.6.4 e non previsto in POSIX).\\
     \hline
   \end{tabular}
   \caption{Costanti identificative dei vari bit del flag di controllo
@@ -1455,7 +1513,16 @@ 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.
 
-\begin{table}[htb]
+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.
+
+\begin{table}[!htb]
   \footnotesize
   \centering
   \begin{tabular}[c]{|l|p{10cm}|}
@@ -1468,14 +1535,14 @@ pseudo-terminali usati nelle connessioni di rete.
                     visualizzazione sul terminale, ad esempio al
                     carattere di a capo (NL) può venire aggiunto un ritorno
                     carrello (CR).\\
-    \const{OCRNL} & Se impostato converte automaticamente il carattere di a
-                    capo (NL) nella coppia di caratteri ritorno carrello, a 
-                    capo (CR-NL).\\
     \const{OLCUC} & Se impostato trasforma i caratteri minuscoli in ingresso 
                     in caratteri maiuscoli sull'uscita (non previsto da
-                    POSIX.1).\\
+                    POSIX).\\
     \const{ONLCR} & Se impostato converte automaticamente il carattere di a 
                     capo (NL) in un carattere di ritorno carrello (CR).\\
+    \const{OCRNL} & Se impostato converte automaticamente il carattere di a
+                    capo (NL) nella coppia di caratteri ritorno carrello, a 
+                    capo (CR-NL).\\
     \const{ONOCR} & Se impostato converte il carattere di ritorno carrello
                     (CR) nella coppia di caratteri CR-NL.\\
     \const{ONLRET}& Se impostato rimuove dall'output il carattere di ritorno
@@ -1483,7 +1550,8 @@ pseudo-terminali usati nelle connessioni di rete.
     \const{OFILL} & Se impostato in caso di ritardo sulla linea invia dei
                     caratteri di riempimento invece di attendere.\\
     \const{OFDEL} & Se impostato il carattere di riempimento è DEL
-                    (\texttt{0x3F}), invece che NUL (\texttt{0x00}).\\
+                    (\texttt{0x3F}), invece che NUL (\texttt{0x00}), (non
+                    previsto da POSIX e non implementato su Linux).\\
     \const{NLDLY} & Maschera per i bit che indicano il ritardo per il
                     carattere di a capo (NL), i valori possibili sono 
                     \val{NL0} o \val{NL1}.\\
@@ -1509,13 +1577,6 @@ pseudo-terminali usati nelle connessioni di rete.
   \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
-tab.~\ref{tab:sess_termios_oflag}.
-
 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
@@ -1535,7 +1596,7 @@ sovrapporsi fra di loro. Occorrerà perciò utilizzare un codice del tipo:
 valore.
 
 
-\begin{table}[htb]
+\begin{table}[!htb]
   \footnotesize
   \centering
   \begin{tabular}[c]{|l|p{10cm}|}
@@ -1543,25 +1604,24 @@ valore.
     \textbf{Valore}& \textbf{Significato}\\
     \hline
     \hline
-    \const{CLOCAL} & Se impostato indica che il terminale è connesso in locale
-                     e che le linee di controllo del modem devono essere
-                     ignorate. Se non impostato effettuando una chiamata ad
-                     \func{open} senza aver specificato il flag di
-                     \const{O\_NOBLOCK} si bloccherà il processo finché 
-                     non si è stabilita una connessione con il modem; inoltre 
-                     se viene rilevata una disconnessione viene inviato un
-                     segnale di \const{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 \errcode{EIO}.\\
-    \const{HUPCL}  & Se è impostato viene distaccata la connessione del
-                     modem quando l'ultimo dei processi che ha ancora un file
-                     aperto sul terminale lo chiude o esce.\\
+    \const{CBAUD}  & Maschera dei bit (4+1) usati per impostare della velocità
+                     della linea (il \textit{baud rate}) in ingresso; non è
+                     presente in POSIX ed in Linux non è implementato in
+                     quanto viene usato un apposito campo di
+                     \struct{termios}.\\ 
+    \const{CBAUDEX}& Bit aggiuntivo per l'impostazione della velocità della
+                     linea, non è presente in POSIX e per le stesse
+                     motivazioni del precedente non è implementato in Linux.\\
+    \const{CSIZE}  & Maschera per i bit usati per specificare la dimensione 
+                     del carattere inviato lungo la linea di trasmissione, i
+                     valore ne indica la lunghezza (in bit), ed i valori   
+                     possibili sono \val{CS5}, \val{CS6}, \val{CS7} e \val{CS8}
+                     corrispondenti ad un analogo numero di bit.\\
+    \const{CSTOPB} & Se impostato vengono usati due bit di stop sulla linea
+                     seriale, se non impostato ne viene usato soltanto uno.\\
     \const{CREAD}  & Se è impostato si può leggere l'input del terminale,
                      altrimenti i caratteri in ingresso vengono scartati
                      quando arrivano.\\
-    \const{CSTOPB} & Se impostato vengono usati due bit di stop sulla linea
-                     seriale, se non impostato ne viene usato soltanto uno.\\
     \const{PARENB} & Se impostato abilita la generazione il controllo di
                      parità. La reazione in caso di errori dipende dai
                      relativi valori per \var{c\_iflag}, riportati in 
@@ -1571,21 +1631,32 @@ valore.
     \const{PARODD} & Ha senso solo se è attivo anche \const{PARENB}. Se 
                      impostato viene usata una parità è dispari, altrimenti 
                      viene usata una parità pari.\\
-    \const{CSIZE}  & Maschera per i bit usati per specificare la dimensione 
-                     del carattere inviato lungo la linea di trasmissione, i
-                     valore ne indica la lunghezza (in bit), ed i valori   
-                     possibili sono \val{CS5}, \val{CS6}, \val{CS7} e \val{CS8}
-                     corrispondenti ad un analogo numero di bit.\\
-    \const{CBAUD}  & Maschera dei bit (4+1) usati per impostare della velocità
-                     della linea (il \textit{baud rate}) in ingresso; in Linux
-                     non è implementato in quanto viene  usato un apposito
-                     campo di \struct{termios}.\\
-    \const{CBAUDEX}& Bit aggiuntivo per l'impostazione della velocità della
-                     linea, per le stesse motivazioni del precedente non è
-                     implementato in Linux.\\
+    \const{HUPCL}  & Se è impostato viene distaccata la connessione del
+                     modem quando l'ultimo dei processi che ha ancora un file
+                     aperto sul terminale lo chiude o esce.\\
+    \const{LOBLK}  & Se impostato blocca l'output su un layer di shell non
+                     corrente, non è presente in POSIX e non è implementato
+                     da Linux.\\
+    \const{CLOCAL} & Se impostato indica che il terminale è connesso in locale
+                     e che le linee di controllo del modem devono essere
+                     ignorate. Se non impostato effettuando una chiamata ad
+                     \func{open} senza aver specificato il flag di
+                     \const{O\_NOBLOCK} si bloccherà il processo finché 
+                     non si è stabilita una connessione con il modem; inoltre 
+                     se viene rilevata una disconnessione viene inviato un
+                     segnale di \const{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 \errcode{EIO}.\\
     \const{CIBAUD} & Maschera dei bit della velocità della linea in
-                     ingresso; analogo a \const{CBAUD}, anch'esso in Linux è
+                     ingresso; analogo a \const{CBAUD}, non è previsto da
+                     POSIX e non è implementato in Linux dato che è
                      mantenuto in un apposito campo di \struct{termios}.\\
+    \const{CMSPAR} & imposta un bit di parità costante: se \const{PARODD} è
+                     impostato la parità è sempre 1 (\textit{MARK}) se non è
+                     impostato la parità è sempre 0 (\textit{SPACE}), non è
+                     previsto da POSIX.\\ 
+% vedi: http://www.lothosoft.ch/thomas/libmip/markspaceparity.php
     \const{CRTSCTS}& Abilita il controllo di flusso hardware sulla seriale,
                      attraverso l'utilizzo delle dei due fili di RTS e CTS.\\
     \hline
@@ -1604,17 +1675,28 @@ del loro significato e delle costanti utilizzate per identificarli è riportato
 in tab.~\ref{tab:sess_termios_cflag}.
 
 I valori di questo flag sono molto specifici, e completamente indirizzati al
-controllo di un terminale mantenuto su una linea seriale; essi pertanto non
-hanno nessuna rilevanza per i terminali che usano un'altra interfaccia, come
-le console virtuali e gli pseudo-terminali usati dalle connessioni di rete.
-
-Inoltre alcuni valori sono previsti solo per quelle implementazioni (lo
-standard POSIX non specifica nulla riguardo l'implementazione, ma solo delle
-funzioni di lettura e scrittura) che mantengono le velocità delle linee
-seriali all'interno dei flag; come accennato in Linux questo viene fatto
-(seguendo l'esempio di BSD) attraverso due campi aggiuntivi, \var{c\_ispeed} e
-\var{c\_ospeed}, nella struttura \struct{termios} (mostrati in
-fig.~\ref{fig:term_termios}).
+controllo di un terminale che opera attraverso una linea seriale; essi
+pertanto non hanno nessuna rilevanza per i terminali che usano un'altra
+interfaccia fisica, come le console virtuali e gli pseudo-terminali usati
+dalle connessioni di rete.
+
+Inoltre alcuni valori di questi flag sono previsti solo per quelle
+implementazioni (lo standard POSIX non specifica nulla riguardo
+l'implementazione, ma solo delle funzioni di lettura e scrittura) che
+mantengono le velocità delle linee seriali all'interno dei flag; come
+accennato in Linux questo viene fatto (seguendo l'esempio di BSD) attraverso
+due campi aggiuntivi, \var{c\_ispeed} e \var{c\_ospeed}, nella struttura
+\struct{termios} (mostrati in fig.~\ref{fig:term_termios}).
+
+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 tab.~\ref{tab:sess_termios_lflag}. Con i terminali odierni l'unico
+flag con cui probabilmente si può avere a che fare è questo, in quanto è con
+questo che si impostano le caratteristiche generiche comuni a tutti i
+terminali.
 
 \begin{table}[b!ht]
   \footnotesize
@@ -1624,8 +1706,16 @@ fig.~\ref{fig:term_termios}).
     \textbf{Valore}& \textbf{Significato}\\
     \hline
     \hline
+    \const{ISIG}   & Se impostato abilita il riconoscimento dei caratteri
+                     INTR, QUIT, e SUSP generando il relativo segnale.\\
     \const{ICANON} & Se impostato il terminale opera in modo canonico,
                      altrimenti opera in modo non canonico.\\
+    \const{XCASE}  & Se impostato il terminale funziona solo con le
+                     maiuscole. L'input è convertito in minuscole tranne per i
+                     caratteri preceduti da una ``\texttt{\bslash}''. In output
+                     le maiuscole sono precedute da una ``\texttt{\bslash}'' e 
+                     le minuscole convertite in maiuscole. Non è presente in
+                     POSIX.\\
     \const{ECHO}   & Se è impostato viene attivato l'eco dei caratteri in
                      input sull'output del terminale.\\
     \const{ECHOE}  & Se è impostato l'eco mostra la cancellazione di un
@@ -1634,22 +1724,11 @@ fig.~\ref{fig:term_termios}).
                      schermo; altrimenti il carattere è rimandato in eco per
                      mostrare quanto accaduto (usato per i terminali con
                      l'uscita su una stampante).\\
-    \const{ECHOPRT}& Se impostato abilita la visualizzazione del carattere di
-                     cancellazione in una modalità adatta ai terminali con
-                     l'uscita su stampante; l'invio del carattere di ERASE
-                     comporta la stampa di un ``\texttt{|}'' seguito dal
-                     carattere cancellato, e così via in caso di successive
-                     cancellazioni, quando si riprende ad immettere carattere 
-                     normali prima verrà stampata una ``\texttt{/}''.\\
     \const{ECHOK}  & Se impostato abilita il trattamento della visualizzazione
                      del carattere KILL, andando a capo dopo aver visualizzato
                      lo stesso, altrimenti viene solo mostrato il carattere e
                      sta all'utente ricordare che l'input precedente è stato
                      cancellato.\\
-    \const{ECHOKE} & Se impostato abilita il trattamento della visualizzazione
-                     del carattere KILL cancellando i caratteri precedenti
-                     nella linea secondo le modalità specificate dai valori di
-                     \const{ECHOE} e \const{ECHOPRT}.\\
     \const{ECHONL} & Se impostato viene effettuato l'eco di un a
                      capo (\verb|\n|) anche se non è stato impostato
                      \const{ECHO}.\\
@@ -1659,32 +1738,40 @@ fig.~\ref{fig:term_termios}).
                      alla lettera ottenuta sommando \texttt{0x40} al valore del
                      carattere (di solito questi si possono ottenere anche
                      direttamente premendo il tasto \texttt{ctrl} più la
-                     relativa lettera).\\
-    \const{ISIG}   & Se impostato abilita il riconoscimento dei caratteri
-                     INTR, QUIT, e SUSP generando il relativo segnale.\\
-    \const{IEXTEN} & Abilita alcune estensioni previste dalla
-                     implementazione. Deve essere impostato perché caratteri
-                     speciali come EOL2, LNEXT, REPRINT e WERASE possano
-                     essere interpretati.\\
+                     relativa lettera). Non è presente in POSIX.\\
+    \const{ECHOPRT}& Se impostato abilita la visualizzazione del carattere di
+                     cancellazione in una modalità adatta ai terminali con
+                     l'uscita su stampante; l'invio del carattere di ERASE
+                     comporta la stampa di un ``\texttt{|}'' seguito dal
+                     carattere cancellato, e così via in caso di successive
+                     cancellazioni, quando si riprende ad immettere carattere 
+                     normali prima verrà stampata una ``\texttt{/}''. Non è
+                     presente in POSIX.\\
+    \const{ECHOKE} & Se impostato abilita il trattamento della visualizzazione
+                     del carattere KILL cancellando i caratteri precedenti
+                     nella linea secondo le modalità specificate dai valori di
+                     \const{ECHOE} e \const{ECHOPRT}. Non è presente in
+                     POSIX.\\ 
+    \const{DEFECHO}& Se impostato effettua l'eco solo se c'è un processo in
+                     lettura. Non è presente in POSIX e non è supportato da
+                     Linux.\\
+    \const{FLUSHO} & Effettua la cancellazione della coda di uscita. Viene
+                     attivato dal carattere DISCARD. Non è presente in POSIX e
+                     non è supportato da Linux.\\
     \const{NOFLSH} & Se impostato disabilita lo scarico delle code di ingresso
                      e uscita quando vengono emessi i segnali \const{SIGINT}, 
                      \const{SIGQUIT} e \const{SIGSUSP}.\\
     \const{TOSTOP} & Se abilitato, con il supporto per il job control presente,
                      genera il segnale \const{SIGTTOU} per un processo in
                      background che cerca di scrivere sul terminale.\\
-    \const{XCASE}  & Se impostato il terminale funziona solo con le
-                     maiuscole. L'input è convertito in minuscole tranne per i
-                     caratteri preceduti da una ``\texttt{\bslash}''. In output
-                     le maiuscole sono precedute da una ``\texttt{\bslash}'' e 
-                     le minuscole convertite in maiuscole.\\
-    \const{DEFECHO}& Se impostato effettua l'eco solo se c'è un processo in
-                     lettura.\\
-    \const{FLUSHO} & Effettua la cancellazione della coda di uscita. Viene
-                     attivato dal carattere DISCARD. Non è supportato in
-                     Linux.\\
     \const{PENDIN} & Indica che la linea deve essere ristampata, viene
                      attivato dal carattere REPRINT e resta attivo fino alla
-                     fine della ristampa. Non è supportato in Linux.\\
+                     fine della ristampa. Non è presente in POSIX e
+                     non è supportato in Linux.\\
+    \const{IEXTEN} & Abilita alcune estensioni previste dalla
+                     implementazione. Deve essere impostato perché caratteri
+                     speciali come EOL2, LNEXT, REPRINT e WERASE possano
+                     essere interpretati.\\
     \hline
   \end{tabular}
   \caption{Costanti identificative dei vari bit del flag di controllo
@@ -1692,16 +1779,6 @@ fig.~\ref{fig:term_termios}).
   \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 tab.~\ref{tab:sess_termios_lflag}. Con i terminali odierni l'unico
-flag con cui probabilmente si può avere a che fare è questo, in quanto è con
-questo che si impostano le caratteristiche generiche comuni a tutti i
-terminali.
-
 Si tenga presente che i flag che riguardano le modalità di eco dei caratteri
 (\const{ECHOE}, \const{ECHOPRT}, \const{ECHOK}, \const{ECHOKE},
 \const{ECHONL}) controllano solo il comportamento della visualizzazione, il
@@ -1717,10 +1794,10 @@ 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]
+\begin{table}[!htb]
   \footnotesize
   \centering
-  \begin{tabular}[c]{|l|c|c|p{7cm}|}
+  \begin{tabular}[c]{|l|c|c|p{9cm}|}
     \hline
     \textbf{Indice} & \textbf{Valore}&\textbf{Codice} & \textbf{Funzione}\\
     \hline
@@ -1728,10 +1805,10 @@ altri.\footnote{in Linux il valore della costante è 32, anche se i caratteri
     \const{VINTR} &\texttt{0x03}&(\texttt{C-c})& Carattere di interrupt, 
                                                  provoca l'emissione di 
                                                  \const{SIGINT}.\\
-    \const{VQUIT} &\texttt{0x1C}&(\texttt{C-|})& Carattere di uscita provoca 
-                                                 l'emissione di 
+    \const{VQUIT} &\texttt{0x1C}&(\texttt{C-\bslash})& Carattere di uscita,  
+                                                 provoca l'emissione di 
                                                  \const{SIGQUIT}.\\
-    \const{VERASE}&\texttt{0x7f}&  DEL         & Carattere di ERASE, cancella
+    \const{VERASE}&\texttt{0x7f}&DEL,\texttt{C-?}& Carattere di ERASE, cancella
                                                  l'ultimo carattere
                                                  precedente nella linea.\\
     \const{VKILL} &\texttt{0x15}&(\texttt{C-u})& Carattere di KILL, cancella
@@ -1748,39 +1825,48 @@ altri.\footnote{in Linux il valore della costante è 32, anche se i caratteri
                                                  zero caratteri, cioè la
                                                  condizione di
                                                  \textit{end-of-file}.\\
-    \const{VTIME} &     ---     &  ---   & Timeout, in decimi di secondo, per
-                                           una lettura in modo non canonico.\\
     \const{VMIN}  &     ---     &  ---   & Numero minimo di caratteri per una 
                                            lettura in modo non canonico.\\
+    \const{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.\\
+    \const{VTIME} &     ---     &  ---   & Timeout, in decimi di secondo, per
+                                           una lettura in modo non canonico.\\
+    \const{VEOL2} &\texttt{0x00}&   NUL  & Ulteriore carattere di fine
+                                           riga. Ha lo stesso effetto di
+                                           \const{VEOL} ma può essere un
+                                           carattere diverso. \\
     \const{VSWTC} &\texttt{0x00}&   NUL  & Carattere di switch. Non supportato
                                            in Linux.\\
-    \const{VSTART}&\texttt{0x21}&(\texttt{C-q})& Carattere di START. Riavvia un
+    \const{VSTART}&\texttt{0x17}&(\texttt{C-q})& Carattere di START. Riavvia un
                                                  output bloccato da uno STOP.\\
-    \const{VSTOP} &\texttt{0x23}&(\texttt{C-s})& Carattere di STOP. Blocca
+    \const{VSTOP} &\texttt{0x19}&(\texttt{C-s})& Carattere di STOP. Blocca
                                                  l'output fintanto che non
                                                  viene premuto un carattere di
                                                  START.\\
     \const{VSUSP} &\texttt{0x1A}&(\texttt{C-z})& Carattere di
                                                  sospensione. Invia il segnale
                                                  \const{SIGTSTP}.\\
-    \const{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.\\
-    \const{VREPRINT}&\texttt{0x12}&(\texttt{C-r})& Ristampa i caratteri non
-                                                 ancora letti.\\
-    \const{VDISCARD}&\texttt{0x07}&(\texttt{C-o})& Non riconosciuto in Linux.\\
-    \const{VWERASE}&\texttt{0x17}&(\texttt{C-w})&Cancellazione di una
-                                                 parola.\\
+    \const{VDSUSP}&\texttt{0x19}&(\texttt{C-y})& Carattere di sospensione
+                                                 ritardata. Invia il segnale 
+                                                 \const{SIGTSTP} quando il
+                                                 carattere viene letto dal
+                                                 programma, (non presente in
+                                                 POSIX e non riconosciuto in
+                                                 Linux).\\ 
     \const{VLNEXT}&\texttt{0x16}&(\texttt{C-v})& Carattere di escape, serve a
                                                  quotare il carattere
                                                  successivo che non viene
                                                  interpretato ma passato
                                                  direttamente all'output.\\
-    \const{VEOL2} &\texttt{0x00}&   NUL  & Ulteriore carattere di fine
-                                           riga. Ha lo stesso effetto di
-                                           \const{VEOL} ma può essere un
-                                           carattere diverso. \\
+    \const{VWERASE}&\texttt{0x17}&(\texttt{C-w})&Cancellazione di una
+                                                 parola.\\
+    \const{VREPRINT}&\texttt{0x12}&(\texttt{C-r})& Ristampa i caratteri non
+                                                 ancora letti (non presente in
+                                                 POSIX).\\
+    \const{VDISCARD}&\texttt{0x0F}&(\texttt{C-o})& Non riconosciuto in Linux.\\
+    \const{VSTATUS} &\texttt{0x13}&(\texttt{C-t})& Non riconosciuto in Linux.\\
     \hline
   \end{tabular}
   \caption{Valori dei caratteri di controllo mantenuti nel campo \var{c\_cc}
@@ -1907,20 +1993,20 @@ 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 fig.~\ref{fig:term_set_attr} e fig.~\ref{fig:term_unset_attr} si è riportato
-rispettivamente il codice delle due funzioni \func{SetTermAttr} e
+In fig.~\ref{fig:term_set_attr} e fig.~\ref{fig:term_unset_attr} si è
+riportato rispettivamente il codice delle due funzioni \func{SetTermAttr} e
 \func{UnSetTermAttr}, che possono essere usate per impostare o rimuovere, con
-le dovute precauzioni, un qualunque bit di \var{c\_lflag}. Il codice di
-entrambe le funzioni può essere trovato nel file \file{SetTermAttr.c} dei
-sorgenti allegati.
+le dovute precauzioni, un qualunque bit di \var{c\_lflag}. Il codice completo
+di entrambe le funzioni può essere trovato nel file \file{SetTermAttr.c} dei
+sorgenti allegati alla guida.
 
 La funzione \func{SetTermAttr} 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});
+(\texttt{\small 8}) con \func{tcgetattr}, uscendo con un messaggio in caso di
+errore (\texttt{\small 9--10}), poi si provvede a impostare solo i bit
+richiesti (possono essere più di uno) con un OR binario (\texttt{\small 12});
 infine si scrive il nuovo valore modificato con \func{tcsetattr}
-(\texttt{\small 16}), notificando un eventuale errore (\texttt{\small 11--14})
+(\texttt{\small 13}), notificando un eventuale errore (\texttt{\small 14-15})
 o uscendo normalmente.
 
 \begin{figure}[!htb]
@@ -1935,11 +2021,10 @@ o uscendo normalmente.
 \end{figure}
 
 La seconda funzione, \func{UnSetTermAttr}, è assolutamente identica alla
-prima, solo che in questo caso, in (\texttt{\small 15}), si rimuovono i bit
+prima, solo che in questo caso (\texttt{\small 9}) si rimuovono i bit
 specificati dall'argomento \param{flag} usando un AND binario del valore
 negato.
 
-
 Al contrario di tutte le altre caratteristiche dei terminali, che possono
 essere impostate esplicitamente utilizzando gli opportuni campi di
 \struct{termios}, per le velocità della linea (il cosiddetto \textit{baud
@@ -2255,7 +2340,7 @@ Qui vanno le cose su \func{openpty} e compagnia.
 
 
 % LocalWords:  kernel multitasking dell'I job control BSD POSIX shell sez group
-% LocalWords:  foreground process bg fg Di waitpid WUNTRACED pgrp session sched
+% LocalWords:  foreground process bg fg waitpid WUNTRACED pgrp session sched
 % LocalWords:  struct pgid sid pid ps getpgid getpgrp SVr unistd void errno int
 % LocalWords:  ESRCH getsid glibc system call XOPEN SOURCE EPERM setpgrp EACCES
 % LocalWords:  setpgid exec EINVAL did fork race condition setsid l'I tty ioctl
@@ -2289,7 +2374,8 @@ Qui vanno le cose su \func{openpty} e compagnia.
 % LocalWords:  tcflush queue TCIFLUSH TCOFLUSH TCIOFLUSH tcflow action TCOOFF
 % LocalWords:  TCOON TCIOFF TCION timer openpty Window nochdir embedded router
 % LocalWords:  access point upstart systemd rsyslog vsyslog variadic src linux
-% LocalWords:  closelog dmesg sysctl klogctl sys ERESTARTSYS
+% LocalWords:  closelog dmesg sysctl klogctl sys ERESTARTSYS ConsoleKit to CoPy
+% LocalWords:  loglevel message libc klog mydmesg CAP ADMIN LXC
 
 %%% Local Variables: 
 %%% mode: latex
index 268d248099cfeb6e71c581b8c773e9dcfbdb8705..7b23cd8f4f3c1202596ec7539336b252ee8d3288 100644 (file)
@@ -112,7 +112,6 @@ int main(int argc, char *argv[])
     if (cmd == 8) third=level;
     else third=i;
 
-
     if ((len = klogctl(cmd, buffer, third)) < 0) {
            perror(err_msg[cmd]);
            exit(0);                  
@@ -132,7 +131,7 @@ int main(int argc, char *argv[])
     case 6:
     case 7:
     case 8:
-       printf("Operation %d executed", cmd);
+       printf("Operation %d executed\n", cmd);
        exit(0);
     case 9:
        printf("Kernel log buffer ring has %d bytes\n", len);