ttyname_r
[gapil.git] / session.tex
index ef1c26a67d197b852bfcd3fb8bf0e1773774dc3e..8f6c3c9d3f1b0eb5b8b2a935342e2c871b0a05ff 100644 (file)
@@ -959,17 +959,17 @@ kernel.
 
 La coda di ingresso mantiene i caratteri che sono stati letti dal terminale ma
 non ancora letti da un processo, la sua dimensione è definita dal parametro di
-sistema \macro{MAX\_INPUT}, che ne specifica il limite minimo, in realtà la
-coda può essere più grande e cambiare dimensione dinamicamente. Se è stato
-abilitato il controllo di flusso in ingresso il driver emette i caratteri di
-STOP e START per bloccare e sbloccare l'ingresso dei dati; altrimenti i
-caratteri immessi oltre le dimensioni massime vengono persi; in alcuni casi il
-driver provvede ad inviare automaticamente un avviso (un carattere di BELL,
-che provoca un beep) sull'output quando si eccedono le dimensioni della coda.
-Se è abilitato il modo canonico i caratteri in ingresso restano nella coda
-fintanto che non viene ricevuto un a capo; un'altra costante,
-\macro{MAX\_CANON}, specifica la dimensione massima di una riga in modo
-canonico.
+sistema \macro{MAX\_INPUT} (si veda \secref{sec:sys_file_limits}), che ne
+specifica il limite minimo, in realtà la coda può essere più grande e cambiare
+dimensione dinamicamente. Se è stato abilitato il controllo di flusso in
+ingresso il driver emette i caratteri di STOP e START per bloccare e sbloccare
+l'ingresso dei dati; altrimenti i caratteri immessi oltre le dimensioni
+massime vengono persi; in alcuni casi il driver provvede ad inviare
+automaticamente un avviso (un carattere di BELL, che provoca un beep)
+sull'output quando si eccedono le dimensioni della coda.  Se è abilitato il
+modo canonico i caratteri in ingresso restano nella coda fintanto che non
+viene ricevuto un a capo; un'altra parametro del sistema, \macro{MAX\_CANON},
+specifica la dimensione massima di una riga in modo canonico.
 
 La coda di uscita è analoga a quella di ingresso e contiene i caratteri
 scritti dai processi ma non ancora inviati al terminale. Se è abilitato il
@@ -992,8 +992,8 @@ System V in una unica interfaccia, che 
 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; questo che può essere verificato utilizzando la funzione
-\func{isatty}, il cui prototipo è:
+terminale (altrimenti si otterrà un errore di \macro{ENOTTY}); questo può
+essere evitato utilizzando la funzione \func{isatty}, il cui prototipo è:
 \begin{prototype}{unistd.h}{int isatty(int desc)}
   
   Controlla se il file descriptor \param{desc} è un terminale.
@@ -1003,11 +1003,11 @@ terminale; questo che pu
 \end{prototype}
 
 Un'altra funzione che fornisce informazioni su un terminale è \func{ttyname},
-che permette anche di ottenere il nome del terminale associato ad un file
+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
@@ -1015,15 +1015,66 @@ descriptor; il suo prototipo 
 \end{prototype}
 
 Si tenga presente che la funzione restituisce un indirizzo di dati statici,
-che pertanto possono essere sovrascritti da successive chiamate. La funzione è
-prevista da POSIX.1, che non definisce \func{isatty}.
+che pertanto possono essere sovrascritti da successive chiamate. Una funzione
+funzione analoga, anch'essa prevista da POSIX.1, è \func{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
+    pathname del terminale.}
+\end{prototype}
+
+La funzione scrive il 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
+\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. 
+
+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
+tenga presente che il 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
-\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
@@ -1035,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 
@@ -1053,7 +1107,7 @@ modificare i bit su cui non si interviene.
 \begin{table}[b!ht]
   \footnotesize
   \centering
-  \begin{tabular}[c]{|l|p{13cm}|}
+  \begin{tabular}[c]{|l|p{11cm}|}
     \hline
     \textbf{Valore}& \textbf{Significato}\\
     \hline
@@ -1146,7 +1200,7 @@ pseudo-terminali usati nelle connessioni di rete.
 \begin{table}[htb]
   \footnotesize
   \centering
-  \begin{tabular}[c]{|l|p{13cm}|}
+  \begin{tabular}[c]{|l|p{11cm}|}
     \hline
     \textbf{Valore}& \textbf{Significato}\\
     \hline
@@ -1229,7 +1283,7 @@ valore.
 \begin{table}[htb]
   \footnotesize
   \centering
-  \begin{tabular}[c]{|l|p{13cm}|}
+  \begin{tabular}[c]{|l|p{11cm}|}
     \hline
     \textbf{Valore}& \textbf{Significato}\\
     \hline
@@ -1305,13 +1359,13 @@ 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
-\secref{fig:term_termios}).
+\var{c\_ospeed}, nella struttura \var{termios} (mostrati in
+\figref{fig:term_termios}).
 
 \begin{table}[b!ht]
   \footnotesize
   \centering
-  \begin{tabular}[c]{|l|p{13cm}|}
+  \begin{tabular}[c]{|l|p{11cm}|}
     \hline
     \textbf{Valore}& \textbf{Significato}\\
     \hline
@@ -1412,7 +1466,7 @@ altri.\footnote{in Linux il valore della costante 
 \begin{table}[htb]
   \footnotesize
   \centering
-  \begin{tabular}[c]{|l|c|c|p{9cm}|}
+  \begin{tabular}[c]{|l|c|c|p{8cm}|}
     \hline
     \textbf{Indice} & \textbf{Valore}&\textbf{Codice} & \textbf{Funzione}\\
     \hline
@@ -1582,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>
@@ -1691,7 +1745,7 @@ sono:
     caso di errore, che avviene solo quando il valore specificato non è
     valido.}
 \end{functions}
-
 Si noti che le funzioni si limitano a scrivere opportunamente il valore della
 velocità prescelta \var{speed} all'interno della struttura puntata da
 \var{termios\_p}; per effettuare l'impostazione effettiva occorrerà poi
@@ -1713,7 +1767,7 @@ velocit
 Un terminale può utilizzare solo alcune delle velocità possibili, le funzioni
 però non controllano se il valore specificato è valido, dato che non possono
 sapere a quale terminale le velocità saranno applicate; sarà l'esecuzione di
-\finc{tcsetattr} a fallire quando si cercherà di eseguire l'impostazione.
+\func{tcsetattr} a fallire quando si cercherà di eseguire l'impostazione.
 
 Di norma il valore ha senso solo per i terminali seriali dove indica appunto
 la velocità della linea di trasmissione; se questa non corrisponde a quella
@@ -1787,7 +1841,9 @@ La funzione invia un flusso di bit nulli (che genera una condizione di break)
 sul terminale associato a \param{fd}; un valore nullo di \param{duration}
 implica una durata del flusso fra 0.25 e 0.5 secondi, un valore diverso da
 zero implica una durata pari a \code{duration*T} dove \code{T} è un valore
-compreso fra 0.25 e 0.5.
+compreso fra 0.25 e 0.5.\footnote{POSIX specifica il comportamento solo nel
+  caso si sia impostato un valore nullo per \param{duration}; il comportamento
+  negli altri casi può dipendere dalla implementazione.}
 
 Le altre funzioni previste da POSIX servono a controllare il comportamento
 dell'interazione fra le code associate al terminale e l'utente; la prima è
@@ -1811,7 +1867,7 @@ di uscita non 
                                 % gestori di cancellazione. 
 
 Una seconda funzione, \func{tcflush}, permette svuotare immediatamente le code
-di cancellando tutti i dati presenti; il suo prototipo è:
+di cancellando tutti i dati presenti al loro interno; il suo prototipo è:
 \begin{functions}
   \headdecl{unistd.h} \headdecl{termios.h}
   
@@ -1823,10 +1879,12 @@ di cancellando tutti i dati presenti; il suo prototipo 
     \macro{ENOTTY}.}
 \end{functions}
 
-La funzione agisce sul terminale associato a \param{fd}, cancellando tutti i
-dati presenti sulla coda specificata dall'argomento \param{queue},
-quest'ultimo può prendere i valori riportati in
-\tabref{tab:sess_tcflush_queue}.
+La funzione agisce sul terminale associato a \param{fd}, l'argomento
+\param{queue} permette di specificare su quale coda (ingresso, uscita o
+entrambe), operare. Esso può prendere i valori riportati in
+\tabref{tab:sess_tcflush_queue}, nel caso si specifichi la coda di ingresso
+cancellerà i dati ricevuti ma non ancora letti, nel caso si specifichi la coda
+di uscita cancellerài dati scritti ma non ancora trasmessi.
 
 \begin{table}[htb]
   \footnotesize
@@ -1836,9 +1894,9 @@ quest'ultimo pu
     \textbf{Valore}& \textbf{Significato}\\
     \hline
     \hline
-    \macro{TCIFLUSH} & Cancella i dati ricevuti ma non ancora letti. \\
-    \macro{TCOFLUSH} & Cancella i dati scritti ma non ancora trasmessi. \\
-    \macro{TCIOFLUSH}& Cancella tutte e due le code.\\
+    \macro{TCIFLUSH} & Cancella i dati sulla coda di ingresso. \\
+    \macro{TCOFLUSH} & Cancella i dati sulla coda di uscita. \\
+    \macro{TCIOFLUSH}& Cancella i dati su entrambe le code.\\
     \hline
   \end{tabular}
   \caption{Possibili valori per l'argomento \param{queue} della
@@ -1847,50 +1905,53 @@ quest'ultimo pu
 \end{table}
 
 
-Infine è possibile è possibile sospendere la trasmissione e la ricezione dei
-dati sul terminale usando \func{tcflow}; il suo prototipo è:
+L'ultima funzione dell'interfaccia che interviene sulla disciplina di linea è
+\func{tcflow}, che viene usata per sospendere la trasmissione e la ricezione
+dei dati sul terminale; il suo prototipo è:
 \begin{functions}
   \headdecl{unistd.h} 
   \headdecl{termios.h}  
   
-  \funcdecl{int tcflow(int fd, int action)} .
+  \funcdecl{int tcflow(int fd, int action)} 
   
+  Sospende e rivvia il flusso dei dati sul terminale.
+
   \bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di
     errore, nel qual caso \var{errno} assumerà i valori \macro{EBADF} o
     \macro{ENOTTY}.}
 \end{functions}
 
+La funzione permette di controllare (interrompendo e facendo riprendere) il
+flusso dei dati fra il terminale ed il sistema sia in ingresso che in uscita.
+Il comportamento della funzione è regolato dall'argomento \param{action}, i
+cui possibili valori, e relativa azione eseguita dalla funzione, sono
+riportati in \secref{tab:sess_tcflow_action}.
 
 \begin{table}[htb]
   \footnotesize
   \centering
   \begin{tabular}[c]{|l|p{8cm}|}
     \hline
-    \textbf{Valore}& \textbf{Significato}\\
+    \textbf{Valore}& \textbf{Azione}\\
     \hline
     \hline
-    \macro{TCOOFF} & Cancella i dati ricevuti ma non ancora letti. \\
-    \macro{TCOON} & Cancella i dati scritti ma non ancora trasmessi. \\
-    \macro{TCIOFF}& Cancella tutte e due le code.\\
-    \macro{TCION}& Cancella tutte e due le code.\\
+    \macro{TCOOFF}& Sospende l'output.\\
+    \macro{TCOON} & Riprende un output precedentemente sospeso.\\
+    \macro{TCIOFF}& Il sistema trasmette un carattere di STOP, che 
+                    fa interrompere la trasmissione dei dati dal terminale.  \\
+    \macro{TCION} & Il sistema trasmette un carattere di START, che 
+                    fa riprendere la trasmissione dei dati dal terminale.\\
     \hline
   \end{tabular}
-  \caption{Possibili valori per l'argomento \param{queue} della
-    funzione \func{tcflush}.} 
-  \label{tab:sess_tcflush_queue}
+  \caption{Possibili valori per l'argomento \param{action} della
+    funzione \func{tcflow}.} 
+  \label{tab:sess_tcflow_action}
 \end{table}
 
 
-\subsection{Il \textsl{modo canonico}}
-\label{sec:term_canonic_mode}
-
-Il modo canonico
-
-
-\subsection{Il \textsl{modo non canonico}}
-\label{sec:term_noncanonic_mode}
+\subsection{Il \textsl{modo canonico} ed il \textsl{modo non canonico}}
+\label{sec:term_terminal_modes}
 
-Il modo non canonico