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
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.
\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)}
\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.
+
+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
\begin{table}[b!ht]
\footnotesize
\centering
- \begin{tabular}[c]{|l|p{13cm}|}
+ \begin{tabular}[c]{|l|p{11cm}|}
\hline
\textbf{Valore}& \textbf{Significato}\\
\hline
\begin{table}[htb]
\footnotesize
\centering
- \begin{tabular}[c]{|l|p{13cm}|}
+ \begin{tabular}[c]{|l|p{11cm}|}
\hline
\textbf{Valore}& \textbf{Significato}\\
\hline
\begin{table}[htb]
\footnotesize
\centering
- \begin{tabular}[c]{|l|p{13cm}|}
+ \begin{tabular}[c]{|l|p{11cm}|}
\hline
\textbf{Valore}& \textbf{Significato}\\
\hline
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}).
+\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
\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
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
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
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 è
% 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}
\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
\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
\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
-
-
+
%%% Local Variables:
%%% mode: latex
-\section{La lettura delle caratteristiche del sistema}
+\section{Capacità e caratteristiche del sistema}
\label{sec:sys_characteristics}
In questa sezione tratteremo le varie modalità con cui un programma può
opzioni di configurazione.
La definizione di queste caratteristiche ed il tentativo di provvedere dei
-meccanismi generali che i programmi potessero usare per ricavarle è uno degli
+meccanismi generali che i programmi possono usare per ricavarle è uno degli
aspetti più complessi e controversi con cui le diverse standardizzazioni si
sono dovute confrontare, spesso con risultati spesso tutt'altro che chiari.
-Proveremo comunque a dare una descrizione dei principali metodi previsti dai
-vari standard per ricavare sia le caratteristiche specifiche del sistema, che
+Daremo comunque una descrizione dei principali metodi previsti dai vari
+standard per ricavare sia le caratteristiche specifiche del sistema, che
quelle della gestione dei file.
\begin{table}[htb]
\centering
\footnotesize
- \begin{tabular}[c]{|l|r|p{8cm}|}
+ \begin{tabular}[c]{|l|r|l|}
\hline
\textbf{Macro}&\textbf{Valore}&\textbf{Significato}\\
\hline
\hline
- \macro{NAME\_MAX}& 14 & lunghezza in byte di un nome di file. \\
- \macro{PATH\_MAX}& 256 & lunghezza in byte di pathname.\\
- \macro{PIPE\_BUF}&4096 & byte scrivibili atomicamente in una pipe\\
\macro{LINK\_MAX} &8 & numero massimo di link a un file\\
- \macro{MAX\_CANON}&255 & spazio disponibile nella coda di input
- canonica del terminale\\
+ \macro{NAME\_MAX}& 14 & lunghezza in byte di un nome di file. \\
+ \macro{PATH\_MAX}& 256 & lunghezza in byte di un pathname.\\
+ \macro{PIPE\_BUF}&4096 & byte scrivibili atomicamente in una pipe
+ (vedi \secref{sec:ipc_pipes}).\\
+ \macro{MAX\_CANON}&255 & dimensione di una riga di terminale in modo
+ canonico (vedi \secref{sec:term_design}).\\
\macro{MAX\_INPUT}&255 & spazio disponibile nella coda di input
- del terminale\\
+ del terminale (vedi \secref{sec:term_design}).\\
\hline
\end{tabular}
\caption{Macro per i limiti sulle caratteristiche dei file.}
\begin{table}[htb]
\centering
\footnotesize
- \begin{tabular}[c]{|l|r|p{8cm}|}
+ \begin{tabular}[c]{|l|r|l|}
\hline
\textbf{Macro}&\textbf{Valore}&\textbf{Significato}\\
\hline
\hline
- \textbf{Macro}&\textbf{Valore}&\textbf{Significato}\\
- \macro{\_POSIX\_LINK\_MAX} &8 & numero massimo di link a un file\\
- \macro{\_POSIX\_MAX\_CANON}&255 & spazio disponibile nella coda di input
- canonica del terminale\\
- \macro{\_POSIX\_MAX\_INPUT}&255 & spazio disponibile nella coda di input
- del terminale\\
+ \macro{\_POSIX\_LINK\_MAX} &8 & numero massimo di link a un file.\\
\macro{\_POSIX\_NAME\_MAX}& 14 & lunghezza in byte di un nome di file. \\
- \macro{\_POSIX\_PATH\_MAX}& 256 & lunghezza in byte di pathname.\\
+ \macro{\_POSIX\_PATH\_MAX}& 256 & lunghezza in byte di un pathname.\\
\macro{\_POSIX\_PIPE\_BUF}& 512 & byte scrivibili atomicamente in una
- pipe\\
+ pipe.\\
+ \macro{\_POSIX\_MAX\_CANON}&255 & dimensione di una riga di
+ terminale in modo canonico.\\
+ \macro{\_POSIX\_MAX\_INPUT}&255 & spazio disponibile nella coda di input
+ del terminale.\\
% \macro{\_POSIX\_MQ\_OPEN\_MAX}& 8& \\
% \macro{\_POSIX\_MQ\_PRIO\_MAX}& 32& \\
% \macro{\_POSIX\_FD\_SETSIZE}& 16 & \\
l'implementazione è specifica di Linux; il suo prototipo è:
\begin{functions}
\headdecl{unistd.h}
-\headdecl{linux/unistd.h}
-\headdecl{linux/sysctl.h}
\funcdecl{int sysctl(int *name, int nlen, void *oldval, size\_t *oldlenp, void
*newval, size\_t newlen)}
\bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di
errore, nel qual caso \var{errno} assumerà uno dei valori:
\begin{errlist}
- \item[\macro{EPERM}] il processo non ha il permesso di accedere ad uno dei
- componenti nel cammino specificato per il parametro, o non ha il permesso
- di accesso al parametro nella modalità scelta.
+ \item[\macro{EPERM}] non si ha il permesso di accedere ad uno dei componenti
+ nel cammino specificato per il parametro, o di accedere al parametro nella
+ modalità scelta.
\item[\macro{ENOTDIR}] non esiste un parametro corrispondente al nome
\param{name}.
- \item[\macro{EFAULT}] si è specificato \param{oldlenp} zero quando
- \param{oldval} è non nullo.
+% \item[\macro{EFAULT}] si è specificato \param{oldlenp} zero quando
+% \param{oldval} è non nullo.
\item[\macro{EINVAL}] o si è specificato un valore non valido per il
parametro che si vuole impostare o lo spazio provvisto per il ritorno di un
valore non è delle giuste dimensioni.
quando non si è specificato sufficiente spazio per ricevere il valore di un
parametro.
\end{errlist}
+ ed inoltre \macro{EFAULT}.
}
\end{functions}
I parametri a cui la funzione permettere di accedere sono organizzati in
-maniera gerarchica all'interno un albero; per accedere ad uno di essi occorre
-specificare un cammino attraverso i vari nodi dell'albero, in maniera analoga
-a come avviene per la risoluzione di un pathname (da cui l'uso alternativo del
-filesystem \file{/proc}, che vedremo dopo).
+maniera gerarchica all'interno un albero;\footnote{si tenga presente che
+ includendo solo \file{unistd.h}, saranno definiti solo i parametri generici;
+ dato che ce ne sono molti specifici dell'implementazione, nel caso di Linux
+ occorrerà includere anche i file \file{linux/unistd.h} e
+ \file{linux/sysctl.h}.} per accedere ad uno di essi occorre specificare un
+cammino attraverso i vari nodi dell'albero, in maniera analoga a come avviene
+per la risoluzione di un pathname (da cui l'uso alternativo del filesystem
+\file{/proc}, che vedremo dopo).
Ciascun nodo dell'albero è identificato da un valore intero, ed il cammino che
arriva ad identificare un parametro specifico è passato alla funzione