Iniziato esempio Mutex
[gapil.git] / session.tex
index ebae61eea60e90e1f2d8d39a3922f55cc013c064..a43f0789d0f5262e0048068503126ded5dd499c0 100644 (file)
@@ -1007,7 +1007,7 @@ che permette di ottenere il nome del terminale associato ad un file
 descriptor; il suo prototipo è:
 \begin{prototype}{unistd.h}{char *ttyname(int desc)}
   
-  Restituisce il nome di un terminale.
+  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 \macro{NULL} in caso di
@@ -1033,7 +1033,30 @@ precedenza ed essere lunga almeno
 \macro{L\_ctermid}\footnote{\macro{L\_ctermid} è una delle varie costanti del
   sistema, non trattata esplicitamente in \secref{sec:sys_characteristics} che
   indica la dimensione che deve avere una stringa per poter contenere il nome
-  di un terminale.} caratteri.
+  di un terminale.} caratteri. 
+
+Esiste infine una versione rientrante \func{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)}
+  
+  Restituisce il nome del terminale associato al file \param{desc}.
+  
+  \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[\macro{ERANGE}] la lunghezza del buffer, \param{len}, non è
+      sufficiente per contenere la stringa restituita.
+    \end{errlist}
+    ed inoltre \macro{EBADF} ed \macro{ENOSYS}.
+}
+\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 \macro{NULL} la funzione restituisce il puntatore
 ad una stringa statica che può essere sovrascritta da chiamate successive. Si
@@ -1042,11 +1065,16 @@ 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
-\var{termios}, (la cui definizione è in \figref{fig:term_termios}), usata
-dalle varie funzioni dell'interfaccia. In \figref{fig:term_termios} si sono
-riportati solo i campi previsti dallo standard POSIX.1, in genere le varie
-implementazioni ne aggiungono degli altri (in Linux e BSD ci sono quelli che
-specificano le velocità della linea) per mantenere ulteriori informazioni.
+\var{termios}, (la cui definizione è riportata in \figref{fig:term_termios}),
+usata dalle varie funzioni dell'interfaccia. In \figref{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).}
 
 \begin{figure}[!htb] 
   \footnotesize \centering
@@ -1058,7 +1086,10 @@ struct termios {
     tcflag_t c_cflag;      /* control modes */
     tcflag_t c_lflag;      /* local modes */
     cc_t c_cc[NCCS];       /* control characters */
-};
+    cc_t c_line;           /* line discipline */
+    speed_t c_ispeed;      /* input speed */
+    speed_t c_ospeed;      /* output speed */
+;
     \end{lstlisting}
   \end{minipage} 
   \normalsize 
@@ -1328,7 +1359,7 @@ 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 \var{termios} (non mostrati in
+\var{c\_ospeed}, nella struttura \var{termios} (mostrati in
 \figref{fig:term_termios}).
 
 \begin{table}[b!ht]
@@ -1605,7 +1636,7 @@ se soltanto uno dei cambiamenti richiesti 
 effettuano più cambiamenti è buona norma controllare con una ulteriore
 chiamata a \func{tcgetattr} che essi siano stati eseguiti tutti quanti.
 
-\begin{figure}[!bht]
+\begin{figure}[!htb]
   \footnotesize 
   \begin{lstlisting}{}%
 #include <unistd.h>
@@ -1897,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
@@ -1918,12 +1949,58 @@ 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}
 
-Il modo non canonico
 
 
 %%% Local Variables: 
 %%% mode: latex