\begin{figure}[htb]
\centering
- \includegraphics[width=15cm]{img/tty_login}
+ \includegraphics[width=13cm]{img/tty_login}
\caption{Schema della procedura di login su un terminale.}
\label{fig:sess_term_login}
\end{figure}
vederli anche in caso di blocco totale del sistema (nell'assunzione che la
console sia collegata).
-In particolare la stampa dei messaggi sulla console è controllata con
-\procfile{/proc/sys/kernel/printk} (o dall'equivalente parametro di
-\func{sysctl}) che prevede quattro valori numerici interi: il primo indica la
-priorità di base oltre la quale vengono stampati i messaggi sulla console, il
-secondo la priorità di default assegnata ai messaggi che non ne hanno
-impostata una, il terzo il valore minimo che si può assegnare al primo
-valore,\footnote{quello che può essere usato con una delle operazioni di
+In particolare la stampa dei messaggi sulla console è controllata dal
+contenuto del file \procfile{/proc/sys/kernel/printk} (o con l'equivalente
+parametro di \func{sysctl}) che prevede quattro valori numerici interi: il
+primo (\textit{console\_loglevel}) indica la priorità corrente oltre la quale
+vengono stampati i messaggi sulla console, il secondo
+(\textit{default\_message\_loglevel}) la priorità di default assegnata ai
+messaggi che non ne hanno impostata una, il terzo
+(\textit{minimum\_console\_level}) il valore minimo che si può assegnare al
+primo valore,\footnote{quello che può essere usato con una delle operazioni di
gestione che vedremo a breve per ``\textsl{silenziare}'' il kernel. } ed il
-quarto come valore di default.\footnote{anch'esso viene usato nelle operazioni
- di controllo per tornare ad un valore predefinito.}
+quarto (\textit{default\_console\_loglevel}) il valore di
+default.\footnote{anch'esso viene usato nelle operazioni di controllo per
+ tornare ad un valore predefinito.}
Per la lettura dei messaggi del kernel e la gestione del relativo buffer
circolare esiste una apposita \textit{system call} chiamata anch'essa
nullo dipendente dall'operazione scelta e $-1$ in caso di errore, nel qual
caso \var{errno} assumerà i valori:
\begin{errlist}
- \item[\errcode{EINVAL}] l'argomento \param{op} non ha un valore valido.
+ \item[\errcode{EINVAL}] l'argomento \param{op} non ha un valore valido, o si
+ sono specificati valori non validi per gli altri argomenti quando questi
+ sono richiesti.
\item[\errcode{ERESTARTSYS}] l'operazione è stata interrotta da un segnale.
- \item[\errcode{EPERM}] non si hanno i privilegi richiesti per l'operazione.
+ \item[\errcode{EPERM}] non si hanno i privilegi richiesti per l'operazione
+ richiesta.
\item[\errcode{ENOSYS}] il supporto per \func{printk} non è stato compilato
nel kernel.
\end{errlist}
La funzione prevede che si passi come primo argomento \param{op} un codice
numerico che indica l'operazione richiesta, il secondo argomento deve essere,
per le operazioni che compiono una lettura di dati, l'indirizzo del buffer su
-cui copiarli, mentre il terzo indica la lunghezza del buffer, quando questo è
-richiesto, oppure un valore numerico. L'effettivo uso di questi due argomenti
-dipende comunque dall'operazione richiesta, ma essi devono essere comunque
-specificati, anche quando non servono, nel qual caso verranno semplicemente
-ignorati.
+cui copiarli, ed il terzo quanti leggerne. L'effettivo uso di questi due
+argomenti dipende comunque dall'operazione richiesta, ma essi devono essere
+comunque specificati, anche quando non servono, nel qual caso verranno
+semplicemente ignorati.
\begin{table}[htb]
\footnotesize
\texttt{8} & imposta a \param{len} il livello dei messaggi stampati sulla
console, \param{buffer} è ignorato.\\
\texttt{9} & ritorna il numero di byte da leggere presenti sul buffer di
- log, \param{buffer} e \param{len} sono ignorati.\\
+ log, \param{buffer} e \param{len} sono ignorati (dal kernel
+ 2.4.10).\\
\texttt{10}& ritorna la dimensione del buffer di log, \param{buffer}
- e \param{len} sono ignorati.\\
+ e \param{len} sono ignorati (dal kernel 2.6.6).\\
\hline
\end{tabular}
\caption{Valori possibili per l'argomento \param{op} di \func{klogctl}.}
\label{tab:klogctl_operation}
\end{table}
-Si sono riportati i possibili valori di \param{op}, con una breve spiegazione
-della relativa operazione e a come vengono usati gli altri due argomenti, in
-tab.~\ref{tab:klogctl_operation}. Come si può notare la funzione è una sorta
-di interfaccia comune usata per eseguire operazioni completamente diverse fra
-loro.
+Si sono riportati in tab.~\ref{tab:klogctl_operation} i possibili valori
+utilizzabili per \param{op}, con una breve spiegazione della relativa
+operazione e a come vengono usati gli altri due argomenti. Come si può notare
+la funzione è una sorta di interfaccia comune usata per eseguire operazioni
+completamente diverse fra loro.
-L'operazione relativa al valore 2 \param{op} consente di leggere un messaggio
-dal cosiddetto \textit{log} del kernel. Eseguire questa operazione è
+L'operazione corrispondente al valore 2 \param{op} consente di leggere un
+messaggio dal cosiddetto \textit{log} del kernel. Eseguire questa operazione è
equivalente ad eseguire una lettura dal file
-\procfile{/proc/kmsg}:\footnote{in realtà è vero l'opposto, è questa funzione
+\procfile{/proc/kmsg},\footnote{in realtà è vero l'opposto, è questa funzione
che viene eseguita quando si legge da questo file.} se non vi sono messaggi
la funzione blocca in attesa di dati e ritorna soltanto quando questi
-diventino disponibili. In tal caso verranno letti \param{len} byte
-su \param{buffer} ed estratti dal log;\footnote{i dati del \textit{log} del
- kernel cioè si possono leggere una volta sola, se più processi eseguono
- l'operazione di lettura soltanto uno riceverà i dati, a meno che completata
- la propria operazione di lettura non restino altri messaggi pendenti che a
- questo punto potrebbero essere letti da un altro processo in attesa.} il
-valore di ritorno di \func{klogctl} corrisponderà al numero di byte ottenuti.
+diventino disponibili. In tal caso verranno letti ed
+estratti\footnote{estratti in quanti i dati del \textit{log} del kernel si
+ possono leggere una volta sola, se più processi eseguono l'operazione di
+ lettura soltanto uno riceverà i dati, a meno che completata la propria
+ operazione di lettura non restino altri messaggi pendenti che a questo punto
+ potrebbero essere letti da un altro processo in attesa.} dal log \param{len}
+byte che verranno scritti su \param{buffer}; il valore di ritorno di
+\func{klogctl} corrisponderà al numero di byte ottenuti.
Se invece si usa l'operazione 3 i dati vengono letti dal buffer circolare
usato da \texttt{printk}, che mantiene tutti i messaggi stampati dal kernel
lettura, di cancellare il buffer circolare, che risulterà vuoto ad una lettura
successiva. Anche con queste operazioni \param{len} indica il numero di byte
da leggere e \param{buffer} il buffer dover leggerli, e la funzione ritorna il
-numero di byte effettivamente letti.
-
-Le operazioni corrispondenti ai valori 6, 7 ed 8 fanno riferimento ai
-parametri del kernel gestiti con \procfile{/proc/sys/kernel/printk}
-
-
+numero di byte effettivamente letti. L'operazione 5 esegue soltanto la
+cancellazione del buffer circolare, \param{len} e \param{buffer} sono ignorati
+e la funzione ritorna un valore nullo.
+
+Le operazioni corrispondenti ai valori 6, 7 ed 8 consentono di modificare la
+priorità oltre la quale i messaggi vengono stampati direttamente sulla
+\textit{console} e fanno riferimento ai parametri del kernel gestiti con le
+variabili contenute in \procfile{/proc/sys/kernel/printk} di cui abbiamo
+parlato prima, ed in particolare con 6 si imposta come corrente il valore
+minimo della terza variabile (\textit{minimum\_console\_level}), ottenendo
+l'effetto di ridurre al minimo i messaggi che arrivano in console, mentre con
+7 si ripristina il valore di default.\footnote{secondo la documentazione
+ questo sarebbe quello indicato della quarta variabile,
+ \textit{default\_console\_loglevel} in genere pari a 7, ma alcune prove con
+ il programma \texttt{mydmesg} che si trova nei sorgenti allegati alla guida
+ rivelano che l'unico effetto di questa operazione è riportare il valore a
+ quello precedente se lo si è ridotto al minimo con l'operazione 6.} Per
+impostare direttamente un valore specifico infine si può usare 8, nel qual
+caso il valore numerico del livello da impostare deve essere specificato
+con \param{len}, che può assumere solo un valore fra 1 e 8.
+
+Infine le due operazioni 9 e 10 consentono di ottenere rispettivamente il
+numero di byte ancora non letti dal log del kernel, e la dimensione totale di
+questo. Per entrambe i dati sono restituiti come valore di ritorno, e gli
+argomento \param{buffer} e \param{len} sono ignorati.
+
+Si tenga presente che la modifica del livello minimo per cui i messaggi
+vengono stampati sulla console (operazioni 6, 7 e 8) e la cancellazione del
+buffer circolare di \texttt{printk} (operazioni 4 e 5) sono privilegiate; fino
+al kernel 2.6.30 era richiesta la capacità \const{CAP\_SYS\_ADMIN}, a partire
+dal 2.6.38 detto privilegio è stato assegnato ad una capacità aggiuntiva,
+\const{CAP\_SYSLOG}. Tutto questo è stato fatto per evitare che processi
+eseguiti all'interno di un sistema di virtualizzazione ``\textsl{leggera}''
+(come i \textit{Linux Container} di LXC) che necessitano di
+\const{CAP\_SYS\_ADMIN} per operare all'interno del proprio ambiente
+ristretto, potessero anche avere la capacità di influire sui log del kernel
+al di fuori di questo.
\itindend{syslog}
\func{write} scriverà sullo schermo. In realtà questo è vero solo a grandi
linee, perché non tiene conto delle caratteristiche specifiche dei terminali;
una delle principali infatti è che essi prevedono due modalità di operazione,
-dette rispettivamente \textsl{modo canonico} e \textsl{modo non canonico}, che
-comportano dei comportamenti nettamente diversi.
+dette rispettivamente ``\textsl{modo canonico}'' e ``\textsl{modo non
+ canonico}'', che hanno dei comportamenti nettamente diversi.
La modalità preimpostata all'apertura del terminale è quella canonica, in cui
le operazioni di lettura vengono sempre effettuate assemblando i dati in una
fintanto che non si preme il tasto di ritorno a capo: a questo punto la
linea sarà completa e la funzione ritornerà.} ed in cui alcuni caratteri
vengono interpretati per compiere operazioni (come la generazione dei segnali
-illustrati in sez.~\ref{sec:sig_job_control}), questa di norma è la modalità in
-cui funziona la shell.
+illustrata in sez.~\ref{sec:sig_job_control}), questa di norma è la modalità
+in cui funziona la shell.
Un terminale in modo non canonico invece non effettua nessun accorpamento dei
dati in linee né li interpreta; esso viene di solito usato dai programmi (gli
dispositivi, viene gestito da un driver apposito, la cui struttura generica è
mostrata in fig.~\ref{fig:term_struct}. Ad un terminale sono sempre associate
due code per gestire l'input e l'output, che ne implementano una
-bufferizzazione\footnote{completamente indipendente dalla eventuale ulteriore
- bufferizzazione fornita dall'interfaccia standard dei file.} all'interno del
-kernel.
+bufferizzazione all'interno del kernel.\footnote{completamente indipendente
+ dalla eventuale ulteriore bufferizzazione fornita dall'interfaccia standard
+ dei file.}
\begin{figure}[htb]
\centering \includegraphics[width=14.5cm]{img/term_struct}
\label{sec:term_attr}
Data le loro peculiarità, fin dall'inizio si è posto il problema di come
-gestire le caratteristiche specifiche dei terminali; storicamente i vari
-dialetti di Unix hanno utilizzato diverse funzioni, alla fine con POSIX.1, è
-stata effettuata una standardizzazione, unificando le differenze fra BSD e
-System V in una unica interfaccia, che è quella usata dal Linux.
+gestire le caratteristiche specifiche dei terminali. Storicamente i vari
+dialetti di Unix hanno utilizzato diverse funzioni, ma alla fine con POSIX.1 è
+stata effettuata una standardizzazione unificando le differenze fra BSD e
+System V in una unica interfaccia, che è quella usata da Linux.
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 (altrimenti si otterrà un errore di \errcode{ENOTTY}); questo può
-essere evitato utilizzando la funzione \funcd{isatty}, il cui prototipo è:
-\begin{prototype}{unistd.h}{int isatty(int desc)}
+terminale, altrimenti si otterrà un errore di \errcode{ENOTTY}; questo può
+essere evitato utilizzando preventivamente la funzione \funcd{isatty}, il cui
+prototipo è:
+\begin{prototype}{unistd.h}{int isatty(int fd)}
- Controlla se il file descriptor \param{desc} è un terminale.
+ Controlla se il file descriptor \param{fd} è un terminale.
-\bodydesc{La funzione restituisce 1 se \param{desc} è connesso ad un
- terminale, 0 altrimenti.}
+ \bodydesc{La funzione restituisce 1 se \param{fd} è connesso ad un
+ terminale, 0 altrimenti, ed in tal caso \var{errno} potrà assumere i
+ valori:
+ \begin{errlist}
+ \item[\errcode{EBADF}] \param{fd} non è un file descriptor valido.
+ \item[\errcode{EINVAL}] \param{fd} non è associato a un terminale (non
+ ottempera a POSIX.1-2001 che richiederebbe \errcode{ENOTTY}).
+ \end{errlist}
+}
\end{prototype}
Un'altra funzione che fornisce informazioni su un terminale è \funcd{ttyname},
-che permette di ottenere il nome del terminale associato ad un file
-descriptor; il suo prototipo è:
-\begin{prototype}{unistd.h}{char *ttyname(int desc)}
+che permette di ottenere il nome del file di dispositivo del terminale
+associato ad un file descriptor; il suo prototipo è:
+\begin{prototype}{unistd.h}{char *ttyname(int fd)}
- 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 \val{NULL} in caso di
- errore.}
-\end{prototype}
-
-Si tenga presente che la funzione restituisce un indirizzo di dati statici,
-che pertanto possono essere sovrascritti da successive chiamate. Una funzione
-funzione analoga, anch'essa prevista da POSIX.1, è \funcd{ctermid}, il cui
-prototipo è:
-\begin{prototype}{stdio.h}{char *ctermid(char *s)}
-
- Restituisce il nome del terminale di controllo del processo.
+ Restituisce il nome del terminale associato a \param{fd}.
\bodydesc{La funzione restituisce il puntatore alla stringa contenente il
- \textit{pathname} del terminale.}
+ nome del terminale associato \param{fd} e \val{NULL} in caso di errore,
+ nel qual caso \var{errno} assumerà i valori:
+ \begin{errlist}
+ \item[\errcode{EBADF}] \param{fd} non è un file descriptor valido.
+ \item[\errcode{ENOTTY}] \param{fd} non è associato a un terminale.
+ \end{errlist}
+}
\end{prototype}
+\noindent ma si tenga presente che la funzione restituisce un indirizzo di
+dati statici, che pertanto possono essere sovrascritti da successive chiamate.
-La funzione scrive il \itindex{pathname} \textit{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
-\const{L\_ctermid}\footnote{\const{L\_ctermid} è una delle varie costanti del
- sistema, non trattata esplicitamente in sez.~\ref{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 \index{funzioni!rientranti} rientrante
-\funcd{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)}
+Della funzione esiste anche una versione \index{funzioni!rientranti}
+rientrante, \funcd{ttyname\_r}, che non presenta il problema dell'uso di una
+zona di memoria statica; il suo prototipo è:
+\begin{prototype}{unistd.h}{int ttyname\_r(int fd, char *buff, size\_t len)}
- Restituisce il nome del terminale associato al file \param{desc}.
+ Restituisce il nome del terminale associato a \param{fd}.
\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[\errcode{ERANGE}] la lunghezza del buffer, \param{len}, non è
+ \item[\errcode{ERANGE}] la lunghezza del buffer \param{len} non è
sufficiente per contenere la stringa restituita.
\end{errlist}
- ed inoltre \errval{EBADF} ed \errval{ENOSYS}.
-}
+ oltre ai precedenti \errval{EBADF} ed \errval{ENOTTY}. }
+\end{prototype}
+
+La funzione prende due argomenti in più, il puntatore \param{buff} alla zona
+di memoria in cui l'utente vuole che il risultato venga scritto, che dovrà
+essere stata allocata in precedenza, e la relativa dimensione,
+\param{len}. Se la stringa che deve essere restituita, compreso lo zero di
+terminazione finale, eccede questa dimensione si avrà una condizione di
+errore.
+
+Una funzione funzione analoga alle precedenti anch'essa prevista da POSIX.1,
+che restituisce sempre il nome di un file di dispositivo, è \funcd{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
+ \textit{pathname} del terminale o \val{NULL} se non non riesce ad eseguire
+ l'operazione.}
\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 \val{NULL} la funzione restituisce il puntatore ad
-una stringa statica che può essere sovrascritta da chiamate successive. Si
-tenga presente che il \itindex{pathname} \textit{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
-\struct{termios}, (la cui definizione è riportata in
-fig.~\ref{fig:term_termios}), usata dalle varie funzioni dell'interfaccia. In
-fig.~\ref{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).}
-% TODO trovare a che serve
+La funzione restituisce un puntatore al \textit{pathname} del file di
+dispositivo del terminale di controllo del processo chiamante. Se si passa
+come argomento \val{NULL} la funzione restituisce il puntatore ad una stringa
+statica che può essere sovrascritta da chiamate successive, e non è
+rientrante. Indicando invece un puntatore ad una zona di memoria già allocata
+la stringa sarà scritta su di essa, ma in questo caso il buffer preallocato
+deve essere di almeno \const{L\_ctermid}\footnote{\const{L\_ctermid} è una
+ delle varie costanti del sistema, non trattata esplicitamente in
+ sez.~\ref{sec:sys_characteristics} che indica la dimensione che deve avere
+ una stringa per poter contenere il nome di un terminale.} caratteri.
+
+Si tenga presente che il \itindex{pathname} \textit{pathname} restituito dalla
+funzione potrebbe non identificare univocamente il terminale (ad esempio
+potrebbe essere \file{/dev/tty}), inoltre non è detto che il processo possa
+effettivamente essere in grado di aprire il terminale.
+
+I vari attributi associati ad un terminale vengono mantenuti per ciascuno di
+essi in una struttura \struct{termios} che viene usata dalle varie funzioni
+dell'interfaccia. In fig.~\ref{fig:term_termios} si sono riportati tutti i
+campi della definizione di questa struttura 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 indicare la
+ disciplina di linea.}
\begin{figure}[!htb]
\footnotesize \centering
\label{fig:term_termios}
\end{figure}
+% per le definizioni dei dati vedi anche:
+% http://www.lafn.org/~dave/linux/termios.txt
+
I primi quattro campi sono quattro flag che controllano il comportamento del
terminale; essi sono realizzati come maschera binaria, pertanto il tipo
\type{tcflag\_t} è di norma realizzato con un intero senza segno di lunghezza
\textbf{Valore}& \textbf{Significato}\\
\hline
\hline
- \const{INPCK} & Abilita il controllo di parità in ingresso. Se non viene
- impostato non viene fatto nessun controllo ed i caratteri
- vengono passati in input direttamente.\\
+ \const{IGNBRK} & Ignora le condizioni di BREAK sull'input. Una
+ \textit{condizione di BREAK} è definita nel contesto di
+ una trasmissione seriale asincrona come una sequenza di
+ bit nulli più lunga di un byte.\\
+ \const{BRKINT} & Controlla la reazione ad un BREAK quando
+ \const{IGNBRK} non è impostato. Se \const{BRKINT} è
+ impostato il BREAK causa lo scarico delle code,
+ e se il terminale è il terminale di controllo per un
+ gruppo in foreground anche l'invio di \const{SIGINT} ai
+ processi di quest'ultimo. Se invece \const{BRKINT} non è
+ impostato un BREAK viene letto come un carattere
+ NUL, a meno che non sia impostato \const{PARMRK}
+ nel qual caso viene letto come la sequenza di caratteri
+ \texttt{0xFF 0x00 0x00}.\\
\const{IGNPAR} & Ignora gli errori di parità, il carattere viene passato
come ricevuto. Ha senso solo se si è impostato
\const{INPCK}.\\
carattere ha il valore \texttt{0xFF} e \const{ISTRIP}
non è impostato, per evitare ambiguità esso viene sempre
riportato come \texttt{0xFF 0xFF}.\\
+ \const{INPCK} & Abilita il controllo di parità in ingresso. Se non viene
+ impostato non viene fatto nessun controllo ed i caratteri
+ vengono passati in input direttamente.\\
\const{ISTRIP} & Se impostato i caratteri in input sono tagliati a sette
bit mettendo a zero il bit più significativo, altrimenti
vengono passati tutti gli otto bit.\\
- \const{IGNBRK} & Ignora le condizioni di BREAK sull'input. Una
- \textit{condizione di BREAK} è definita nel contesto di
- una trasmissione seriale asincrona come una sequenza di
- bit nulli più lunga di un byte.\\
- \const{BRKINT} & Controlla la reazione ad un BREAK quando
- \const{IGNBRK} non è impostato. Se \const{BRKINT} è
- impostato il BREAK causa lo scarico delle code,
- e se il terminale è il terminale di controllo per un
- gruppo in foreground anche l'invio di \const{SIGINT} ai
- processi di quest'ultimo. Se invece \const{BRKINT} non è
- impostato un BREAK viene letto come un carattere
- NUL, a meno che non sia impostato \const{PARMRK}
- nel qual caso viene letto come la sequenza di caratteri
- \texttt{0xFF 0x00 0x00}.\\
+ \const{INLCR} & Se impostato in ingresso il carattere di a capo
+ (\verb|'\n'|) viene automaticamente trasformato in un
+ ritorno carrello (\verb|'\r'|).\\
\const{IGNCR} & Se impostato il carattere di ritorno carrello
(\textit{carriage return}, \verb|'\r'|) viene scartato
dall'input. Può essere utile per i terminali che inviano
(\verb|'\r'|) sul terminale viene automaticamente
trasformato in un a capo (\verb|'\n'|) sulla coda di
input.\\
- \const{INLCR} & Se impostato il carattere di a capo
- (\verb|'\n'|) viene automaticamente trasformato in un
- ritorno carrello (\verb|'\r'|).\\
\const{IUCLC} & Se impostato trasforma i caratteri maiuscoli dal
terminale in minuscoli sull'ingresso (opzione non
POSIX).\\
di ingresso; in Linux non è implementato e il kernel si
comporta cose se fosse sempre impostato (è una estensione
BSD).\\
+ \const{IUTF8} & Indica che l'input è in UTF-8, cosa che consente di
+ utilizzare la cancellazione dei caratteri in maniera
+ corretta (dal kernel 2.6.4 e non previsto in POSIX).\\
\hline
\end{tabular}
\caption{Costanti identificative dei vari bit del flag di controllo
alcun effetto su dispositivi diversi come le console virtuali o gli
pseudo-terminali usati nelle connessioni di rete.
-\begin{table}[htb]
+Il secondo flag, mantenuto nel campo \var{c\_oflag}, è detto \textsl{flag di
+ output} e controlla le modalità di funzionamento dell'output dei caratteri,
+come l'impacchettamento dei caratteri sullo schermo, la traslazione degli a
+capo, la conversione dei caratteri speciali; un elenco dei vari bit, del loro
+significato e delle costanti utilizzate per identificarli è riportato in
+tab.~\ref{tab:sess_termios_oflag}, di questi solo \const{OPOST} era previsto
+da POSIX.1, buona parte degli altri sono stati aggiunti in POSIX.1-2001,
+quelli ancora assenti sono stati indicati esplicitamente.
+
+\begin{table}[!htb]
\footnotesize
\centering
\begin{tabular}[c]{|l|p{10cm}|}
visualizzazione sul terminale, ad esempio al
carattere di a capo (NL) può venire aggiunto un ritorno
carrello (CR).\\
- \const{OCRNL} & Se impostato converte automaticamente il carattere di a
- capo (NL) nella coppia di caratteri ritorno carrello, a
- capo (CR-NL).\\
\const{OLCUC} & Se impostato trasforma i caratteri minuscoli in ingresso
in caratteri maiuscoli sull'uscita (non previsto da
- POSIX.1).\\
+ POSIX).\\
\const{ONLCR} & Se impostato converte automaticamente il carattere di a
capo (NL) in un carattere di ritorno carrello (CR).\\
+ \const{OCRNL} & Se impostato converte automaticamente il carattere di a
+ capo (NL) nella coppia di caratteri ritorno carrello, a
+ capo (CR-NL).\\
\const{ONOCR} & Se impostato converte il carattere di ritorno carrello
(CR) nella coppia di caratteri CR-NL.\\
\const{ONLRET}& Se impostato rimuove dall'output il carattere di ritorno
\const{OFILL} & Se impostato in caso di ritardo sulla linea invia dei
caratteri di riempimento invece di attendere.\\
\const{OFDEL} & Se impostato il carattere di riempimento è DEL
- (\texttt{0x3F}), invece che NUL (\texttt{0x00}).\\
+ (\texttt{0x3F}), invece che NUL (\texttt{0x00}), (non
+ previsto da POSIX e non implementato su Linux).\\
\const{NLDLY} & Maschera per i bit che indicano il ritardo per il
carattere di a capo (NL), i valori possibili sono
\val{NL0} o \val{NL1}.\\
\label{tab:sess_termios_oflag}
\end{table}
-Il secondo flag, mantenuto nel campo \var{c\_oflag}, è detto \textsl{flag di
- output} e controlla le modalità di funzionamento dell'output dei caratteri,
-come l'impacchettamento dei caratteri sullo schermo, la traslazione degli a
-capo, la conversione dei caratteri speciali; un elenco dei vari bit, del loro
-significato e delle costanti utilizzate per identificarli è riportato in
-tab.~\ref{tab:sess_termios_oflag}.
-
Si noti come alcuni dei valori riportati in tab.~\ref{tab:sess_termios_oflag}
fanno riferimento a delle maschere di bit; essi infatti vengono utilizzati per
impostare alcuni valori numerici relativi ai ritardi nell'output di alcuni
valore.
-\begin{table}[htb]
+\begin{table}[!htb]
\footnotesize
\centering
\begin{tabular}[c]{|l|p{10cm}|}
\textbf{Valore}& \textbf{Significato}\\
\hline
\hline
- \const{CLOCAL} & Se impostato indica che il terminale è connesso in locale
- e che le linee di controllo del modem devono essere
- ignorate. Se non impostato effettuando una chiamata ad
- \func{open} senza aver specificato il flag di
- \const{O\_NOBLOCK} si bloccherà il processo finché
- non si è stabilita una connessione con il modem; inoltre
- se viene rilevata una disconnessione viene inviato un
- segnale di \const{SIGHUP} al processo di controllo del
- terminale. La lettura su un terminale sconnesso comporta
- una condizione di \textit{end of file} e la scrittura un
- errore di \errcode{EIO}.\\
- \const{HUPCL} & Se è impostato viene distaccata la connessione del
- modem quando l'ultimo dei processi che ha ancora un file
- aperto sul terminale lo chiude o esce.\\
+ \const{CBAUD} & Maschera dei bit (4+1) usati per impostare della velocità
+ della linea (il \textit{baud rate}) in ingresso; non è
+ presente in POSIX ed in Linux non è implementato in
+ quanto viene usato un apposito campo di
+ \struct{termios}.\\
+ \const{CBAUDEX}& Bit aggiuntivo per l'impostazione della velocità della
+ linea, non è presente in POSIX e per le stesse
+ motivazioni del precedente non è implementato in Linux.\\
+ \const{CSIZE} & Maschera per i bit usati per specificare la dimensione
+ del carattere inviato lungo la linea di trasmissione, i
+ valore ne indica la lunghezza (in bit), ed i valori
+ possibili sono \val{CS5}, \val{CS6}, \val{CS7} e \val{CS8}
+ corrispondenti ad un analogo numero di bit.\\
+ \const{CSTOPB} & Se impostato vengono usati due bit di stop sulla linea
+ seriale, se non impostato ne viene usato soltanto uno.\\
\const{CREAD} & Se è impostato si può leggere l'input del terminale,
altrimenti i caratteri in ingresso vengono scartati
quando arrivano.\\
- \const{CSTOPB} & Se impostato vengono usati due bit di stop sulla linea
- seriale, se non impostato ne viene usato soltanto uno.\\
\const{PARENB} & Se impostato abilita la generazione il controllo di
parità. La reazione in caso di errori dipende dai
relativi valori per \var{c\_iflag}, riportati in
\const{PARODD} & Ha senso solo se è attivo anche \const{PARENB}. Se
impostato viene usata una parità è dispari, altrimenti
viene usata una parità pari.\\
- \const{CSIZE} & Maschera per i bit usati per specificare la dimensione
- del carattere inviato lungo la linea di trasmissione, i
- valore ne indica la lunghezza (in bit), ed i valori
- possibili sono \val{CS5}, \val{CS6}, \val{CS7} e \val{CS8}
- corrispondenti ad un analogo numero di bit.\\
- \const{CBAUD} & Maschera dei bit (4+1) usati per impostare della velocità
- della linea (il \textit{baud rate}) in ingresso; in Linux
- non è implementato in quanto viene usato un apposito
- campo di \struct{termios}.\\
- \const{CBAUDEX}& Bit aggiuntivo per l'impostazione della velocità della
- linea, per le stesse motivazioni del precedente non è
- implementato in Linux.\\
+ \const{HUPCL} & Se è impostato viene distaccata la connessione del
+ modem quando l'ultimo dei processi che ha ancora un file
+ aperto sul terminale lo chiude o esce.\\
+ \const{LOBLK} & Se impostato blocca l'output su un layer di shell non
+ corrente, non è presente in POSIX e non è implementato
+ da Linux.\\
+ \const{CLOCAL} & Se impostato indica che il terminale è connesso in locale
+ e che le linee di controllo del modem devono essere
+ ignorate. Se non impostato effettuando una chiamata ad
+ \func{open} senza aver specificato il flag di
+ \const{O\_NOBLOCK} si bloccherà il processo finché
+ non si è stabilita una connessione con il modem; inoltre
+ se viene rilevata una disconnessione viene inviato un
+ segnale di \const{SIGHUP} al processo di controllo del
+ terminale. La lettura su un terminale sconnesso comporta
+ una condizione di \textit{end of file} e la scrittura un
+ errore di \errcode{EIO}.\\
\const{CIBAUD} & Maschera dei bit della velocità della linea in
- ingresso; analogo a \const{CBAUD}, anch'esso in Linux è
+ ingresso; analogo a \const{CBAUD}, non è previsto da
+ POSIX e non è implementato in Linux dato che è
mantenuto in un apposito campo di \struct{termios}.\\
+ \const{CMSPAR} & imposta un bit di parità costante: se \const{PARODD} è
+ impostato la parità è sempre 1 (\textit{MARK}) se non è
+ impostato la parità è sempre 0 (\textit{SPACE}), non è
+ previsto da POSIX.\\
+% vedi: http://www.lothosoft.ch/thomas/libmip/markspaceparity.php
\const{CRTSCTS}& Abilita il controllo di flusso hardware sulla seriale,
attraverso l'utilizzo delle dei due fili di RTS e CTS.\\
\hline
in tab.~\ref{tab:sess_termios_cflag}.
I valori di questo flag sono molto specifici, e completamente indirizzati al
-controllo di un terminale mantenuto su una linea seriale; essi pertanto non
-hanno nessuna rilevanza per i terminali che usano un'altra interfaccia, come
-le console virtuali e gli pseudo-terminali usati dalle connessioni di rete.
-
-Inoltre alcuni valori sono previsti solo per quelle implementazioni (lo
-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 \struct{termios} (mostrati in
-fig.~\ref{fig:term_termios}).
+controllo di un terminale che opera attraverso una linea seriale; essi
+pertanto non hanno nessuna rilevanza per i terminali che usano un'altra
+interfaccia fisica, come le console virtuali e gli pseudo-terminali usati
+dalle connessioni di rete.
+
+Inoltre alcuni valori di questi flag sono previsti solo per quelle
+implementazioni (lo 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
+\struct{termios} (mostrati in fig.~\ref{fig:term_termios}).
+
+Il quarto flag, mantenuto nel campo \var{c\_lflag}, è detto \textsl{flag
+ locale}, e serve per controllare il funzionamento dell'interfaccia fra il
+driver e l'utente, come abilitare l'eco, gestire i caratteri di controllo e
+l'emissione dei segnali, impostare modo canonico o non canonico; un elenco dei
+vari bit, del loro significato e delle costanti utilizzate per identificarli è
+riportato in tab.~\ref{tab:sess_termios_lflag}. Con i terminali odierni l'unico
+flag con cui probabilmente si può avere a che fare è questo, in quanto è con
+questo che si impostano le caratteristiche generiche comuni a tutti i
+terminali.
\begin{table}[b!ht]
\footnotesize
\textbf{Valore}& \textbf{Significato}\\
\hline
\hline
+ \const{ISIG} & Se impostato abilita il riconoscimento dei caratteri
+ INTR, QUIT, e SUSP generando il relativo segnale.\\
\const{ICANON} & Se impostato il terminale opera in modo canonico,
altrimenti opera in modo non canonico.\\
+ \const{XCASE} & Se impostato il terminale funziona solo con le
+ maiuscole. L'input è convertito in minuscole tranne per i
+ caratteri preceduti da una ``\texttt{\bslash}''. In output
+ le maiuscole sono precedute da una ``\texttt{\bslash}'' e
+ le minuscole convertite in maiuscole. Non è presente in
+ POSIX.\\
\const{ECHO} & Se è impostato viene attivato l'eco dei caratteri in
input sull'output del terminale.\\
\const{ECHOE} & Se è impostato l'eco mostra la cancellazione di un
schermo; altrimenti il carattere è rimandato in eco per
mostrare quanto accaduto (usato per i terminali con
l'uscita su una stampante).\\
- \const{ECHOPRT}& Se impostato abilita la visualizzazione del carattere di
- cancellazione in una modalità adatta ai terminali con
- l'uscita su stampante; l'invio del carattere di ERASE
- comporta la stampa di un ``\texttt{|}'' seguito dal
- carattere cancellato, e così via in caso di successive
- cancellazioni, quando si riprende ad immettere carattere
- normali prima verrà stampata una ``\texttt{/}''.\\
\const{ECHOK} & Se impostato abilita il trattamento della visualizzazione
del carattere KILL, andando a capo dopo aver visualizzato
lo stesso, altrimenti viene solo mostrato il carattere e
sta all'utente ricordare che l'input precedente è stato
cancellato.\\
- \const{ECHOKE} & Se impostato abilita il trattamento della visualizzazione
- del carattere KILL cancellando i caratteri precedenti
- nella linea secondo le modalità specificate dai valori di
- \const{ECHOE} e \const{ECHOPRT}.\\
\const{ECHONL} & Se impostato viene effettuato l'eco di un a
capo (\verb|\n|) anche se non è stato impostato
\const{ECHO}.\\
alla lettera ottenuta sommando \texttt{0x40} al valore del
carattere (di solito questi si possono ottenere anche
direttamente premendo il tasto \texttt{ctrl} più la
- relativa lettera).\\
- \const{ISIG} & Se impostato abilita il riconoscimento dei caratteri
- INTR, QUIT, e SUSP generando il relativo segnale.\\
- \const{IEXTEN} & Abilita alcune estensioni previste dalla
- implementazione. Deve essere impostato perché caratteri
- speciali come EOL2, LNEXT, REPRINT e WERASE possano
- essere interpretati.\\
+ relativa lettera). Non è presente in POSIX.\\
+ \const{ECHOPRT}& Se impostato abilita la visualizzazione del carattere di
+ cancellazione in una modalità adatta ai terminali con
+ l'uscita su stampante; l'invio del carattere di ERASE
+ comporta la stampa di un ``\texttt{|}'' seguito dal
+ carattere cancellato, e così via in caso di successive
+ cancellazioni, quando si riprende ad immettere carattere
+ normali prima verrà stampata una ``\texttt{/}''. Non è
+ presente in POSIX.\\
+ \const{ECHOKE} & Se impostato abilita il trattamento della visualizzazione
+ del carattere KILL cancellando i caratteri precedenti
+ nella linea secondo le modalità specificate dai valori di
+ \const{ECHOE} e \const{ECHOPRT}. Non è presente in
+ POSIX.\\
+ \const{DEFECHO}& Se impostato effettua l'eco solo se c'è un processo in
+ lettura. Non è presente in POSIX e non è supportato da
+ Linux.\\
+ \const{FLUSHO} & Effettua la cancellazione della coda di uscita. Viene
+ attivato dal carattere DISCARD. Non è presente in POSIX e
+ non è supportato da Linux.\\
\const{NOFLSH} & Se impostato disabilita lo scarico delle code di ingresso
e uscita quando vengono emessi i segnali \const{SIGINT},
\const{SIGQUIT} e \const{SIGSUSP}.\\
\const{TOSTOP} & Se abilitato, con il supporto per il job control presente,
genera il segnale \const{SIGTTOU} per un processo in
background che cerca di scrivere sul terminale.\\
- \const{XCASE} & Se impostato il terminale funziona solo con le
- maiuscole. L'input è convertito in minuscole tranne per i
- caratteri preceduti da una ``\texttt{\bslash}''. In output
- le maiuscole sono precedute da una ``\texttt{\bslash}'' e
- le minuscole convertite in maiuscole.\\
- \const{DEFECHO}& Se impostato effettua l'eco solo se c'è un processo in
- lettura.\\
- \const{FLUSHO} & Effettua la cancellazione della coda di uscita. Viene
- attivato dal carattere DISCARD. Non è supportato in
- Linux.\\
\const{PENDIN} & Indica che la linea deve essere ristampata, viene
attivato dal carattere REPRINT e resta attivo fino alla
- fine della ristampa. Non è supportato in Linux.\\
+ fine della ristampa. Non è presente in POSIX e
+ non è supportato in Linux.\\
+ \const{IEXTEN} & Abilita alcune estensioni previste dalla
+ implementazione. Deve essere impostato perché caratteri
+ speciali come EOL2, LNEXT, REPRINT e WERASE possano
+ essere interpretati.\\
\hline
\end{tabular}
\caption{Costanti identificative dei vari bit del flag di controllo
\label{tab:sess_termios_lflag}
\end{table}
-Il quarto flag, mantenuto nel campo \var{c\_lflag}, è detto \textsl{flag
- locale}, e serve per controllare il funzionamento dell'interfaccia fra il
-driver e l'utente, come abilitare l'eco, gestire i caratteri di controllo e
-l'emissione dei segnali, impostare modo canonico o non canonico; un elenco dei
-vari bit, del loro significato e delle costanti utilizzate per identificarli è
-riportato in tab.~\ref{tab:sess_termios_lflag}. Con i terminali odierni l'unico
-flag con cui probabilmente si può avere a che fare è questo, in quanto è con
-questo che si impostano le caratteristiche generiche comuni a tutti i
-terminali.
-
Si tenga presente che i flag che riguardano le modalità di eco dei caratteri
(\const{ECHOE}, \const{ECHOPRT}, \const{ECHOK}, \const{ECHOKE},
\const{ECHONL}) controllano solo il comportamento della visualizzazione, il
altri.\footnote{in Linux il valore della costante è 32, anche se i caratteri
effettivamente definiti sono solo 17.}
-\begin{table}[htb]
+\begin{table}[!htb]
\footnotesize
\centering
- \begin{tabular}[c]{|l|c|c|p{7cm}|}
+ \begin{tabular}[c]{|l|c|c|p{9cm}|}
\hline
\textbf{Indice} & \textbf{Valore}&\textbf{Codice} & \textbf{Funzione}\\
\hline
\const{VINTR} &\texttt{0x03}&(\texttt{C-c})& Carattere di interrupt,
provoca l'emissione di
\const{SIGINT}.\\
- \const{VQUIT} &\texttt{0x1C}&(\texttt{C-|})& Carattere di uscita provoca
- l'emissione di
+ \const{VQUIT} &\texttt{0x1C}&(\texttt{C-\bslash})& Carattere di uscita,
+ provoca l'emissione di
\const{SIGQUIT}.\\
- \const{VERASE}&\texttt{0x7f}& DEL & Carattere di ERASE, cancella
+ \const{VERASE}&\texttt{0x7f}&DEL,\texttt{C-?}& Carattere di ERASE, cancella
l'ultimo carattere
precedente nella linea.\\
\const{VKILL} &\texttt{0x15}&(\texttt{C-u})& Carattere di KILL, cancella
zero caratteri, cioè la
condizione di
\textit{end-of-file}.\\
- \const{VTIME} & --- & --- & Timeout, in decimi di secondo, per
- una lettura in modo non canonico.\\
\const{VMIN} & --- & --- & Numero minimo di caratteri per una
lettura in modo non canonico.\\
+ \const{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.\\
+ \const{VTIME} & --- & --- & Timeout, in decimi di secondo, per
+ una lettura in modo non canonico.\\
+ \const{VEOL2} &\texttt{0x00}& NUL & Ulteriore carattere di fine
+ riga. Ha lo stesso effetto di
+ \const{VEOL} ma può essere un
+ carattere diverso. \\
\const{VSWTC} &\texttt{0x00}& NUL & Carattere di switch. Non supportato
in Linux.\\
- \const{VSTART}&\texttt{0x21}&(\texttt{C-q})& Carattere di START. Riavvia un
+ \const{VSTART}&\texttt{0x17}&(\texttt{C-q})& Carattere di START. Riavvia un
output bloccato da uno STOP.\\
- \const{VSTOP} &\texttt{0x23}&(\texttt{C-s})& Carattere di STOP. Blocca
+ \const{VSTOP} &\texttt{0x19}&(\texttt{C-s})& Carattere di STOP. Blocca
l'output fintanto che non
viene premuto un carattere di
START.\\
\const{VSUSP} &\texttt{0x1A}&(\texttt{C-z})& Carattere di
sospensione. Invia il segnale
\const{SIGTSTP}.\\
- \const{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.\\
- \const{VREPRINT}&\texttt{0x12}&(\texttt{C-r})& Ristampa i caratteri non
- ancora letti.\\
- \const{VDISCARD}&\texttt{0x07}&(\texttt{C-o})& Non riconosciuto in Linux.\\
- \const{VWERASE}&\texttt{0x17}&(\texttt{C-w})&Cancellazione di una
- parola.\\
+ \const{VDSUSP}&\texttt{0x19}&(\texttt{C-y})& Carattere di sospensione
+ ritardata. Invia il segnale
+ \const{SIGTSTP} quando il
+ carattere viene letto dal
+ programma, (non presente in
+ POSIX e non riconosciuto in
+ Linux).\\
\const{VLNEXT}&\texttt{0x16}&(\texttt{C-v})& Carattere di escape, serve a
quotare il carattere
successivo che non viene
interpretato ma passato
direttamente all'output.\\
- \const{VEOL2} &\texttt{0x00}& NUL & Ulteriore carattere di fine
- riga. Ha lo stesso effetto di
- \const{VEOL} ma può essere un
- carattere diverso. \\
+ \const{VWERASE}&\texttt{0x17}&(\texttt{C-w})&Cancellazione di una
+ parola.\\
+ \const{VREPRINT}&\texttt{0x12}&(\texttt{C-r})& Ristampa i caratteri non
+ ancora letti (non presente in
+ POSIX).\\
+ \const{VDISCARD}&\texttt{0x0F}&(\texttt{C-o})& Non riconosciuto in Linux.\\
+ \const{VSTATUS} &\texttt{0x13}&(\texttt{C-t})& Non riconosciuto in Linux.\\
\hline
\end{tabular}
\caption{Valori dei caratteri di controllo mantenuti nel campo \var{c\_cc}
valore corrente delle impostazioni con \func{tcgetattr} per poi modificare i
valori impostati.
-In fig.~\ref{fig:term_set_attr} e fig.~\ref{fig:term_unset_attr} si è riportato
-rispettivamente il codice delle due funzioni \func{SetTermAttr} e
+In fig.~\ref{fig:term_set_attr} e fig.~\ref{fig:term_unset_attr} si è
+riportato rispettivamente il codice delle due funzioni \func{SetTermAttr} e
\func{UnSetTermAttr}, che possono essere usate per impostare o rimuovere, con
-le dovute precauzioni, un qualunque bit di \var{c\_lflag}. Il codice di
-entrambe le funzioni può essere trovato nel file \file{SetTermAttr.c} dei
-sorgenti allegati.
+le dovute precauzioni, un qualunque bit di \var{c\_lflag}. Il codice completo
+di entrambe le funzioni può essere trovato nel file \file{SetTermAttr.c} dei
+sorgenti allegati alla guida.
La funzione \func{SetTermAttr} provvede ad impostare il bit specificato
dall'argomento \param{flag}; prima si leggono i valori correnti
-(\texttt{\small 10}) con \func{tcgetattr}, uscendo con un messaggio in caso di
-errore (\texttt{\small 11--14}), poi si provvede a impostare solo i bit
-richiesti (possono essere più di uno) con un OR binario (\texttt{\small 15});
+(\texttt{\small 8}) con \func{tcgetattr}, uscendo con un messaggio in caso di
+errore (\texttt{\small 9--10}), poi si provvede a impostare solo i bit
+richiesti (possono essere più di uno) con un OR binario (\texttt{\small 12});
infine si scrive il nuovo valore modificato con \func{tcsetattr}
-(\texttt{\small 16}), notificando un eventuale errore (\texttt{\small 11--14})
+(\texttt{\small 13}), notificando un eventuale errore (\texttt{\small 14-15})
o uscendo normalmente.
\begin{figure}[!htb]
\end{figure}
La seconda funzione, \func{UnSetTermAttr}, è assolutamente identica alla
-prima, solo che in questo caso, in (\texttt{\small 15}), si rimuovono i bit
+prima, solo che in questo caso (\texttt{\small 9}) si rimuovono i bit
specificati dall'argomento \param{flag} usando un AND binario del valore
negato.
-
Al contrario di tutte le altre caratteristiche dei terminali, che possono
essere impostate esplicitamente utilizzando gli opportuni campi di
\struct{termios}, per le velocità della linea (il cosiddetto \textit{baud
% LocalWords: kernel multitasking dell'I job control BSD POSIX shell sez group
-% LocalWords: foreground process bg fg Di waitpid WUNTRACED pgrp session sched
+% LocalWords: foreground process bg fg waitpid WUNTRACED pgrp session sched
% LocalWords: struct pgid sid pid ps getpgid getpgrp SVr unistd void errno int
% LocalWords: ESRCH getsid glibc system call XOPEN SOURCE EPERM setpgrp EACCES
% LocalWords: setpgid exec EINVAL did fork race condition setsid l'I tty ioctl
% LocalWords: tcflush queue TCIFLUSH TCOFLUSH TCIOFLUSH tcflow action TCOOFF
% LocalWords: TCOON TCIOFF TCION timer openpty Window nochdir embedded router
% LocalWords: access point upstart systemd rsyslog vsyslog variadic src linux
-% LocalWords: closelog dmesg sysctl klogctl sys ERESTARTSYS
+% LocalWords: closelog dmesg sysctl klogctl sys ERESTARTSYS ConsoleKit to CoPy
+% LocalWords: loglevel message libc klog mydmesg CAP ADMIN LXC
%%% Local Variables:
%%% mode: latex