Caratteri di controllo
authorSimone Piccardi <piccardi@gnulinux.it>
Wed, 9 Oct 2002 22:36:29 +0000 (22:36 +0000)
committerSimone Piccardi <piccardi@gnulinux.it>
Wed, 9 Oct 2002 22:36:29 +0000 (22:36 +0000)
session.tex

index 6424af197f5dbe8931cc929c6b3bbe06ee251d31..80e73394504f08e6e97d86eeccc27023465441b0 100644 (file)
@@ -1222,11 +1222,14 @@ Si tenga presente inoltre che nel caso delle maschere il valore da inserire in
 della maschera, i valori da immettere infatti (quelli riportati nella
 spiegazione corrispondente) sono numerici e non per bit, per cui possono
 sovrapporsi fra di loro. Occorrerà perciò utilizzare un codice del tipo:
-\begin{lstlisting}[labelstep=0,frame=,indent=1cm]{}
+
+\begin{lstlisting}[labelstep=0,frame=,indent=1cm]{}%
     c_oflag &= (~CRDLY);
     c_oflag |= CR1;
 \end{lstlisting}
-che prima cancella i bit della maschera in questione e poi setta il valore.
+
+\noindent che prima cancella i bit della maschera in questione e poi setta il
+valore.
 
 
 \begin{table}[htb]
@@ -1443,7 +1446,7 @@ trovato nel file \file{SetTermAttr.c} dei sorgenti allegati.
 
 \begin{figure}[!htb]
   \footnotesize 
-  \begin{lstlisting}{}
+  \begin{lstlisting}{}%
 #include <unistd.h>
 #include <termios.h>
 #include <errno.h>
@@ -1484,7 +1487,7 @@ int UnSetTermAttr(int fd, tcflag_t flag)
     }
     return 0;
 }
-    \end{lstlisting}
+  \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}
@@ -1513,7 +1516,7 @@ qualora si cambino i parametri di output.
 \begin{table}[htb]
   \footnotesize
   \centering
-  \begin{tabular}[c]{|l|p{13cm}|}
+  \begin{tabular}[c]{|l|p{8cm}|}
     \hline
     \textbf{Valore}& \textbf{Significato}\\
     \hline
@@ -1531,9 +1534,109 @@ qualora si cambino i parametri di output.
 \end{table}
 
 Infine occorre tenere presente che \func{tcsetattr} ritorna con successo anche
-se uno qualunque dei cambiamenti richiesti è stato eseguito. Pertanto se si
+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
+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:
+
+\begin{lstlisting}[labelstep=0,frame=,indent=1cm]{}%
+    value.c_cc[VEOL2] = '\n';
+\end{lstlisting}
+
+\noindent e si potrà poi ricorrere a \func{tcsetattr} per rendere effettiva la
+nuova impostazione.
+
+Come già accennato POSIX.1 prevede due funzioni da utilizzare esplicitamente
+per settare la velocità delle linee seriali, \func{cfsetispeed} e
+\func{cfsetospeed}
+
 
 \subsection{Il \textsl{modo canonico}}
 \label{sec:term_canonic_mode}