From: Simone Piccardi Date: Sun, 13 Oct 2002 23:08:57 +0000 (+0000) Subject: Modo non canonico X-Git-Url: https://gapil.gnulinux.it/gitweb/?a=commitdiff_plain;h=b962dde7e38380bb770e6625d2b211e7c14a52e4;p=gapil.git Modo non canonico --- diff --git a/session.tex b/session.tex index 8f6c3c9..1af067b 100644 --- a/session.tex +++ b/session.tex @@ -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}