Iniziato esempio Mutex
[gapil.git] / session.tex
index 8f6c3c9d3f1b0eb5b8b2a935342e2c871b0a05ff..a43f0789d0f5262e0048068503126ded5dd499c0 100644 (file)
@@ -1074,7 +1074,7 @@ 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}.}
+  \var{c\_line} per ... (NdT, trovare a che serve).}
 
 \begin{figure}[!htb] 
   \footnotesize \centering
@@ -1928,7 +1928,7 @@ cui possibili valori, e relativa azione eseguita dalla funzione, sono
 riportati in \secref{tab:sess_tcflow_action}.
 
 \begin{table}[htb]
-  \footnotesize
+   \footnotesize
   \centering
   \begin{tabular}[c]{|l|p{8cm}|}
     \hline
@@ -1949,10 +1949,56 @@ riportati in \secref{tab:sess_tcflow_action}.
 \end{table}
 
 
-\subsection{Il \textsl{modo canonico} ed il \textsl{modo non canonico}}
-\label{sec:term_terminal_modes}
-
-
+\subsection{Operare in \textsl{modo non canonico}}
+\label{sec:term_non_canonical}
+
+Operare con un terminale in modo canonico è relativamente semplice; basta
+eseguire una lettura e la funzione ritornerà quando una il driver del
+terminale avrà completato una linea di input. Non è detto che la linea sia
+letta interamente (si può aver richiesto un numero inferiore di byte) ma in
+ogni caso nessun dato verrà perso, e il resto della linea sarà letto alla
+chiamata successiva.
+
+Inoltre in modo canonico la gestione dell'input è di norma eseguita
+direttamente dal driver del terminale, che si incarica (a seconda di quanto
+impostato con le funzioni viste nei paragrafi precedenti) di cancellare i
+caratteri, bloccare e riavviare il flusso dei dati, terminare la linea quando
+viene ricevuti uno dei vari caratteri di terminazione (NL, EOL, EOL2, EOF).
+
+In modo non canonico tocca invece al programma gestire tutto quanto, i
+caratteri NL, EOL, EOL2, EOF, ERASE, KILL, CR, REPRINT non vengono
+interpretati automaticamente ed inoltre, non dividendo più l'input in linee,
+il sistema non ha più un limite definito per quando ritornare i dati ad un
+processo. Per questo motivo abbiamo visto che in \var{c\_cc} sono previsti due
+caratteri speciali, MIN e TIME (specificati dagli indici \macro{VMIN} e
+\macro{VTIME} in \var{c\_cc}) che dicono al sistema di ritornare da una
+\func{read} quando è stata letta una determinata quantità di dati o è passato
+un certo tempo.
+
+Come accennato nella relativa spiegazione in \tabref{tab:sess_termios_cc},
+TIME e MIN non sono in realtà caratteri ma valori numerici. Il comportamento
+del sistema per un terminale in modalità non canonica prevede quattro casi
+distinti:
+\begin{description}
+\item[MIN$>0$, TIME$>0$] In questo caso MIN stabilisce il numero minimo di
+  caratteri desiderati e TIME un tempo di attesa, in decimi di secondo, fra un
+  carattere e l'altro. Una \func{read} ritorna se vengono ricevuti almeno MIN
+  caratteri prima della scadenza di TIME (MIN è solo un limite inferiore, se
+  la funzione ha richiesto un numero maggiore di caratteri ne possono essere
+  restituiti di più); se invece TIME scade vengono restituiti i byte ricevuti
+  fino ad allora (un carattere viene sempre letto, dato che il timer inizia a
+  scorrere solo dopo la ricezione del primo carattere).
+\item[MIN$>0$, TIME$=0$] Una \func{read} ritorna solo dopo che sono stati
+  ricevuti almeno MIN caratteri. Questo significa che una \func{read} può
+  bloccarsi indefinitamente. 
+\item[MIN$=0$, TIME$>0$] In questo caso TIME indica un tempo di attesa dalla
+  chiamata di \func{read}, la funzione ritorna non appena viene ricevuto un
+  carattere o scade il tempo. Si noti che è possibile che \func{read} ritorni
+  con un valore nullo.
+\item[MIN$=0$, TIME$=0$] In questo caso una \func{read} ritorna immediatamente
+  restituendo tutti i caratteri ricevuti. Anche in questo caso può ritornare
+  con un valore nullo.
+\end{description}