From 607fcef8aad9ec8be0a80cc4c069c92902455f90 Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Wed, 10 Aug 2011 16:56:47 +0000 Subject: [PATCH] Revisione terminali continua, aggiunti alcuni nuovi flag e corrette alcune costanti. --- listati/SetTermAttr.c | 7 +- listati/UnSetTermAttr.c | 6 +- listati/termios.h | 10 +- session.tex | 616 +++++++++++++++++++++++----------------- sources/mydmesg.c | 3 +- 5 files changed, 361 insertions(+), 281 deletions(-) diff --git a/listati/SetTermAttr.c b/listati/SetTermAttr.c index 41656f2..fbec08f 100644 --- a/listati/SetTermAttr.c +++ b/listati/SetTermAttr.c @@ -1,19 +1,16 @@ #include #include #include - int SetTermAttr(int fd, tcflag_t flag) { struct termios values; int res; - res = tcgetattr (desc, &values); - if (res) { + if (res = tcgetattr(desc, &values)) { perror("Cannot get attributes"); return res; } values.c_lflag |= flag; - res = tcsetattr (desc, TCSANOW, &values); - if (res) { + if (res = tcsetattr(desc, TCSANOW, &values)) { perror("Cannot set attributes"); return res; } diff --git a/listati/UnSetTermAttr.c b/listati/UnSetTermAttr.c index fbeec75..bb9c21b 100644 --- a/listati/UnSetTermAttr.c +++ b/listati/UnSetTermAttr.c @@ -2,14 +2,12 @@ int UnSetTermAttr(int fd, tcflag_t flag) { struct termios values; int res; - res = tcgetattr (desc, &values); - if (res) { + if (res = tcgetattr(desc, &values)) { perror("Cannot get attributes"); return res; } values.c_lflag &= (~flag); - res = tcsetattr (desc, TCSANOW, &values); - if (res) { + if (res = tcsetattr(desc, TCSANOW, &values)) { perror("Cannot set attributes"); return res; } diff --git a/listati/termios.h b/listati/termios.h index b0be108..18957ba 100644 --- a/listati/termios.h +++ b/listati/termios.h @@ -1,10 +1,10 @@ struct termios { - tcflag_t c_iflag; /* input modes */ - tcflag_t c_oflag; /* output modes */ - tcflag_t c_cflag; /* control modes */ - tcflag_t c_lflag; /* local modes */ - cc_t c_cc[NCCS]; /* control characters */ + tcflag_t c_iflag; /* input mode flagss */ + tcflag_t c_oflag; /* output modes flags */ + tcflag_t c_cflag; /* control modes flags */ + tcflag_t c_lflag; /* local modes flags */ cc_t c_line; /* line discipline */ + cc_t c_cc[NCCS]; /* control characters */ speed_t c_ispeed; /* input speed */ speed_t c_ospeed; /* output speed */ }; diff --git a/session.tex b/session.tex index f0827b0..fdb7683 100644 --- a/session.tex +++ b/session.tex @@ -536,7 +536,7 @@ che permetta l'accesso ad un terminale. Uno schema di massima della procedura \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} @@ -1022,16 +1022,19 @@ sistema,\footnote{quello che viene indicato con il parametro di avvio 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 @@ -1048,9 +1051,12 @@ Gestisce i messaggi di log del kernel. 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} @@ -1061,11 +1067,10 @@ Gestisce i messaggi di log del kernel. 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 @@ -1094,34 +1099,36 @@ ignorati. \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 @@ -1130,12 +1137,43 @@ letti più volte. Usando invece l'operazione 4 si richiede, dopo aver fatto la 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} @@ -1191,8 +1229,8 @@ avremo che \func{read} leggerà quanto immesso dalla tastiera, mentre \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 @@ -1201,8 +1239,8 @@ linea;\footnote{per cui eseguendo una \func{read} su un terminale in modo 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 @@ -1214,9 +1252,9 @@ modalità con cui esso viene effettuato; l'accesso, come per tutti i 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} @@ -1251,99 +1289,113 @@ provvede automaticamente a bloccare la funzione chiamante. \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 @@ -1356,6 +1408,9 @@ ulteriori informazioni.\footnote{la definizione della struttura si trova in \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 @@ -1370,9 +1425,20 @@ modificare i bit su cui non si interviene. \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}.\\ @@ -1385,23 +1451,15 @@ modificare i bit su cui non si interviene. 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 @@ -1411,9 +1469,6 @@ modificare i bit su cui non si interviene. (\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).\\ @@ -1435,6 +1490,9 @@ modificare i bit su cui non si interviene. 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 @@ -1455,7 +1513,16 @@ obsolete; la maggior parte inoltre è tipica di terminali seriali, e non ha 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}|} @@ -1468,14 +1535,14 @@ pseudo-terminali usati nelle connessioni di rete. 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 @@ -1483,7 +1550,8 @@ pseudo-terminali usati nelle connessioni di rete. \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}.\\ @@ -1509,13 +1577,6 @@ pseudo-terminali usati nelle connessioni di rete. \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 @@ -1535,7 +1596,7 @@ sovrapporsi fra di loro. Occorrerà perciò utilizzare un codice del tipo: valore. -\begin{table}[htb] +\begin{table}[!htb] \footnotesize \centering \begin{tabular}[c]{|l|p{10cm}|} @@ -1543,25 +1604,24 @@ valore. \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 @@ -1571,21 +1631,32 @@ valore. \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 @@ -1604,17 +1675,28 @@ del loro significato e delle costanti utilizzate per identificarli è riportato 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 @@ -1624,8 +1706,16 @@ fig.~\ref{fig:term_termios}). \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 @@ -1634,22 +1724,11 @@ fig.~\ref{fig:term_termios}). 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}.\\ @@ -1659,32 +1738,40 @@ fig.~\ref{fig:term_termios}). 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 @@ -1692,16 +1779,6 @@ fig.~\ref{fig:term_termios}). \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 @@ -1717,10 +1794,10 @@ POSIX ne specifica almeno 11, ma molte implementazioni ne definiscono molti 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 @@ -1728,10 +1805,10 @@ altri.\footnote{in Linux il valore della costante è 32, anche se i caratteri \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 @@ -1748,39 +1825,48 @@ altri.\footnote{in Linux il valore della costante è 32, anche se i caratteri 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} @@ -1907,20 +1993,20 @@ intatti gli altri; per questo motivo in generale si deve prima leggere il 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] @@ -1935,11 +2021,10 @@ o uscendo normalmente. \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 @@ -2255,7 +2340,7 @@ Qui vanno le cose su \func{openpty} e compagnia. % 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 @@ -2289,7 +2374,8 @@ Qui vanno le cose su \func{openpty} e compagnia. % 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 diff --git a/sources/mydmesg.c b/sources/mydmesg.c index 268d248..7b23cd8 100644 --- a/sources/mydmesg.c +++ b/sources/mydmesg.c @@ -112,7 +112,6 @@ int main(int argc, char *argv[]) if (cmd == 8) third=level; else third=i; - if ((len = klogctl(cmd, buffer, third)) < 0) { perror(err_msg[cmd]); exit(0); @@ -132,7 +131,7 @@ int main(int argc, char *argv[]) case 6: case 7: case 8: - printf("Operation %d executed", cmd); + printf("Operation %d executed\n", cmd); exit(0); case 9: printf("Kernel log buffer ring has %d bytes\n", len); -- 2.30.2