X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=session.tex;h=a43f0789d0f5262e0048068503126ded5dd499c0;hp=ebae61eea60e90e1f2d8d39a3922f55cc013c064;hb=d7d656d5cd4969c58126d2c35950a607c282e330;hpb=57c1291f77a1a179e67c4506b3e05e74ad89d21e diff --git a/session.tex b/session.tex index ebae61e..a43f078 100644 --- a/session.tex +++ b/session.tex @@ -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 @@ -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