X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=session.tex;h=10129fa70b7f24995a3b0262ce3ed71e126a2520;hp=5d994d3b614f47b837c65eebb7bcce0f05668252;hb=999678703d956565dbc4c1707482e9114026be82;hpb=01347de6f6af21c6c4ec7d9702e7c087621b2228 diff --git a/session.tex b/session.tex index 5d994d3..10129fa 100644 --- a/session.tex +++ b/session.tex @@ -1,13 +1,18 @@ - \chapter{Sessioni di lavoro e terminali} +\chapter{Terminali e sessioni di lavoro} \label{cha:session} -Esamineremo in questo capitolo i concetti base del sistema delle sessioni di -lavoro, vale a dire il metodo con cui il kernel gestisce l'accesso concorrente -al sistema da parte di più utenti, permettendo loro di eseguire più programmi -in contemporanea. Nella seconda parte del capitolo tratteremo poi il -funzionamento dell'I/O su terminale, e delle varie peculiarità che esso viene -ad assumere a causa del suo stretto legame con le modalità di accesso al -sistema da parte degli utenti. +I terminali per lungo tempo tempo sono stati l'unico modo per accedere al +sistema, per questo anche oggi che esistono molte altre interfacce, essi +continuano a coprire un ruolo particolare, restando strettamente legati al +funzionamento dell'interfaccia a linea di comando. + +Mella prima parte del capitolo esamineremo i concetti base del sistema delle +sessioni di lavoro, vale a dire il metodo con cui il kernel permette ad un +utente di gestire le capacità multitiasking del sistema, permettendo di +eseguire più programmi in contemporanea. Nella seconda parte del capitolo +tratteremo poi il funzionamento dell'I/O su terminale, e delle varie +peculiarità che esso viene ad assumere a causa del suo stretto legame con il +suo uso come interfaccia di accesso al sistema da parte degli utenti. \section{Il \textit{job control}} @@ -490,11 +495,7 @@ Un terminale, che esso sia un terminale effettivo, attaccato ad una seriale o ad un altro tipo di porta di comunicazione, o una delle console virtuali associate allo schermo, viene sempre visto attraverso attraverso un device driver che ne presenta un'interfaccia comune su un apposito file di -dispositivo. Storicamente i primi terminali erano appunto terminali di -telescriventi (\textit{teletype}), da cui deriva sia il nome dell'interfaccia, -\textit{tty}, che quello dei relativi file di dispositivo, che sono sempre -della forma \texttt{/dev/tty*}.\footnote{questo vale anche per i terminali - virtuali associati alle connessioni di rete con \cmd{telnet} o \cmd{ssh}.} +dispositivo. Per controllare un terminale si usa di solito il programma \cmd{getty} (od una delle sue varianti), che permette di mettersi in ascolto su uno di questi @@ -678,12 +679,16 @@ messaggi del kernel.\footnote{i messaggi del kernel sono tenuti in un buffer si trova in \cite{LinDevDri}, nel quarto capitolo.} Il servizio permette poi di trattare i vari messaggi classificandoli -attraverso due indici; il primo, chiamato \textit{facility}, indica quale -categoria di demone ha emesso il messaggio, ed è organizzato in sottosistemi -(kernel, posta elettronica, demoni di stampa, ecc.), il secondo, chiamato -\textit{priority}, identifica l'importanza del messaggio. Il sistema di -\textit{syslog} provvede poi a riportare i messaggi all'amministratore -attraverso differenti meccanismi come: +attraverso due indici; il primo, chiamato \textit{facility}, suddivide in +diverse categorie i vari demoni in modo di raggruppare i messaggi provenienti +da operazioni che hanno attinenza fra loro, ed è organizzato in sottosistemi +(kernel, posta elettronica, demoni di stampa, ecc.). Il secondo, chiamato +\textit{priority}, identifica l'importanza dei vari messaggi, e permette di +classificarli e differenziare le modalità di notifica degli stessi. + +Il sistema di \textit{syslog} attraverso \cmd{syslogd} provvede poi a +riportare i messaggi all'amministratore attraverso una serie differenti +meccanismi come: \begin{itemize*} \item scrivere sulla console. \item inviare via mail ad uno specifico utente. @@ -697,15 +702,15 @@ dettagli si possono trovare sulle pagine di manuale per questo file e per \cmd{syslogd}). Le \acr{glibc} definiscono una serie di funzioni standard con cui un processo -può accedere in maniera generica al servizio di syslog, che però funzionano -solo localmente; se si vogliono inviare i messaggi ad un'altro sistema occorre -farlo esplicitamente con un socket UDP, o utilizzare le capacità di reinvio -del servizio. - -La prima funzione definita dall'interfaccia è \func{openlog}; essa in generale -non è necessaria per l'uso del servizio, ma permette di impostare alcuni -valori che controllano gli effetti delle chiamate successive; il suo prototipo -è: +può accedere in maniera generica al servizio di \textit{syslog}, che però +funzionano solo localmente; se si vogliono inviare i messaggi ad un'altro +sistema occorre farlo esplicitamente con un socket UDP, o utilizzare le +capacità di reinvio del servizio. + +La prima funzione definita dall'interfaccia è \func{openlog}, che apre una +connessione al servizio di \textit{syslog}; essa in generale non è necessaria +per l'uso del servizio, ma permette di impostare alcuni valori che controllano +gli effetti delle chiamate successive; il suo prototipo è: \begin{prototype}{syslog.h}{void openlog(const char *ident, int option, int facility)} @@ -717,49 +722,278 @@ Apre una connessione al sistema di \textit{syslog}. La funzione permette di specificare, tramite \param{ident}, l'identità di chi ha inviato il messaggio (di norma si passa il nome del programma, come specificato da \code{argv[0]}); la stringa verrà preposta all'inizio di ogni -messaggio. Il parametro \param{facility} permette invece di specificare -l'omonimo indice; i valori possibili sono riportati in -\tabref{tab:sess_syslog_facility}. +messaggio. Si tenga presente che il valore di \param{ident} che si passa alla +funzione è un puntatore, se la stringa cui punta viene cambiata lo sarà pure +nei successivi messaggi, e se viene cancellata i risultati potranno essere +impredicibili, per questo è sempre opportuno usare una stringa costante. + +L'argomento \param{facility} permette invece di preimpostare per le successive +chiamate l'omonimo indice che classifica la categoria del messaggio. +L'argomento è interpretato come una maschera binaria, e pertanto è possibile +inviare i messaggi su più categorie alla volta; i valori delle costanti che +identificano ciascuna categoria sono riportati in +\tabref{tab:sess_syslog_facility}, il valore di \param{facility} deve essere +specificato con un OR aritmetico. \begin{table}[htb] + \footnotesize + \centering + \begin{tabular}[c]{|l|p{8cm}|} + \hline + \textbf{Valore}& \textbf{Significato}\\ + \hline + \hline + \macro{LOG\_AUTH} & Messaggi relativi ad autenticazione e sicurezza, + obsoleto, è sostituito da \macro{LOG\_AUTHPRIV}. \\ + \macro{LOG\_AUTHPRIV} & Sostituisce \macro{LOG\_AUTH}.\\ + \macro{LOG\_CRON} & Messaggi dei demoni di gestione dei comandi + programmati (\cmd{cron} e \cmd{at}).\\ + \macro{LOG\_DAEMON} & Demoni di sistema.\\ + \macro{LOG\_FTP} & Server FTP.\\ + \macro{LOG\_KERN} & Messaggi del kernel\\ + \macro{LOG\_LOCAL0} & Riservato all'amministratore per uso locale\\ + --- & \\ + \macro{LOG\_LOCAL7} & Riservato all'amministratore per uso locale\\ + \macro{LOG\_LPR} & Messaggi del sistema di gestione delle stampanti \\ + \macro{LOG\_MAIL} & Messaggi del sistema di posta elettronica\\ + \macro{LOG\_NEWS} & Messaggi del sistema di gestione delle news + (USENET) \\ + \macro{LOG\_SYSLOG} & Messaggi generati dallo stesso \cmd{syslogd}\\ + \macro{LOG\_USER} & Messaggi generici a livello utente\\ + \macro{LOG\_UUCP} & Messaggi del sistema UUCP\\ +\hline +\end{tabular} +\caption{Valori possibili per l'argomento \param{facility} di \func{openlog}.} +\label{tab:sess_syslog_facility} +\end{table} + +L'argomento \param{option} serve invece per controllare il comportamento della +funzione \func{openlog} e delle modalità con cui le successive chiamate +scriveranno i messaggi, esso viene specificato come maschera binaria composta +con un OR aritmetico di una qualunque delle costanti riportate in +\tabref{tab:sess_openlog_option}. + +\begin{table}[htb] + \footnotesize \centering \begin{tabular}[c]{|l|p{8cm}|} \hline \textbf{Valore}& \textbf{Significato}\\ \hline \hline -\macro{LOG\_AUTH} & Messaggi relativi ad autenticazione e sicurezza, - obsoleto, è sostituito da \macro{LOG\_AUTHPRIV}. \\ -\macro{LOG\_AUTHPRIV} & Sostituisce \macro{LOG\_AUTH}.\\ -\macro{LOG\_CRON} & Messaggi dei demoni di gestione dei comandi - programmati (\cmd{cron} e \cmd{at}).\\ -\macro{LOG\_DAEMON} & Demoni di sistema.\\ -\macro{LOG\_FTP} & Server FTP.\\ -\macro{LOG\_KERN} & Messaggi del kernel\\ -\macro{LOG\_LOCAL0} & Riservato all'amministratore per uso locale\\ ---- & \\ -\macro{LOG\_LOCAL7} & Riservato all'amministratore per uso locale\\ -\macro{LOG\_LPR} & Messaggi del sistema di gestione delle stampanti \\ -\macro{LOG\_MAIL} & Messaggi del sistema di posta elettronica\\ -\macro{LOG\_NEWS} & Messaggi del sistema di gestione delle news (USENET) \\ -\macro{LOG\_SYSLOG} & Messaggi generati dallo stesso \cmd{syslogd}\\ -\macro{LOG\_USER} & Messaggi generici a livello utente\\ -\macro{LOG\_UUCP} & Messaggi del sistema UUCP\\ +\macro{LOG\_CONS} & Scrive sulla console quando. \\ +\macro{LOG\_NDELAY} & Sostituisce \macro{LOG\_AUTH}.\\ +\macro{LOG\_NOWAIT} & Messaggi dei demoni di gestione dei comandi + programmati (\cmd{cron} e \cmd{at}).\\ +\macro{LOG\_ODELAY} & .\\ +\macro{LOG\_PERROR} & Stampa anche su \file{stderr}.\\ +\macro{LOG\_PID} & Inserisce nei messaggi il \acr{pid} del processo + chiamante. \\ \hline \end{tabular} -\caption{Valori possibili per l'argomento \param{facility} di \func{openlog}.} -\label{tab:sess_syslog_facility} +\caption{Valori possibili per l'argomento \param{option} di \func{openlog}.} +\label{tab:sess_openlog_option} \end{table} +La funzione che si usa per generare un messaggio è \func{syslog}, dato che +l'uso di \func{openlog} è ozionale, sarà quest'ultima a provvede a chiamare la +prima qualora ciò non sia stato fatto (nel qual caso il valore di +\param{ident} è nullo). Il suo prototipo è: +\begin{prototype}{syslog.h} +{void syslog(int priority, const char *format, ...)} + +Genera un messaggio di priorità \param{priority}. + +\bodydesc{La funzione non restituisce nulla.} +\end{prototype} + +Il comportamento della funzione è analogo quello di \func{printf}, e il valore +dell'argomento \param{format} è identico a quello descritto nella pagina di +manuale di quest'ultima (per i valori principali si può vedere la trattazione +sommaria che se ne è fatto in \secref{sec:file_formatted_io}); l'unica +differenza è che la sequenza \cmd{\%m} viene rimpiazzata dalla stringa +restituita da \code{strerror(errno)}. Gli argomenti seguenti i primi due +devono essere forniti secondo quanto richiesto da \func{format}. + +L'argomento \param{priority} permette di impostare sia la \textit{facility} +che la \textit{priority} del messaggio. In realtà viene prevalentemente usato +per specificare solo quest'ultima in quanto la prima viene di norma +preimpostata con \func{openlog}. La priorità è indicata con un valore +numerico\footnote{le \acr{glibc}, seguendo POSIX.1-2001, prevedono otto + diverse priorità ordinate da 0 a 7, in ordine di importanza decrescente; + questo comporta che i tre bit meno significativi dell'argomento + \param{priority} sono occupati da questo valore, mentre i restanti bit più + significativi vengono usati per specificare la \textit{facility}.} +specificabile attraverso le costanti riportate in +\secref{tab:sess_syslog_priority}. Nel caso si voglia specificare anche la +\textit{facility} basta eseguire un OR aritmetico del valore della priorità +con la maschera binaria delle costanti di \tabref{tab:sess_syslog_facility}. + +\begin{table}[htb] + \footnotesize + \centering + \begin{tabular}[c]{|l|p{8cm}|} + \hline + \textbf{Valore}& \textbf{Significato}\\ + \hline + \hline + \macro{LOG\_EMERG} & Il sistema è inutilizzabile. \\ + \macro{LOG\_ALERT} & C'è una emergenza che richiede intervento + immediato.\\ + \macro{LOG\_CRIT} & Si è in una condizione critica.\\ + \macro{LOG\_ERR} & Si è in una condizione di errore.\\ + \macro{LOG\_WARNING} & Messaggio di avvertimento.\\ + \macro{LOG\_NOTICE} & Notizia significativa relativa al comportamento.\\ + \macro{LOG\_INFO} & Messaggio informativo. \\ + \macro{LOG\_DEBUG} & Messaggio di debug.\\ + \hline + \end{tabular} + \caption{Valori possibili per l'indice di importanza del messaggio da + specificare nell'argomento \param{priority} di \func{syslog}.} + \label{tab:sess_syslog_priority} +\end{table} + +Una ulteriore funzione, \func{setlogmask}, permette di filtrare +preliminarmente i messaggi in base alla loro priorità; il suo prototipo è: +\begin{prototype}{syslog.h} +{int setlogmask(int mask)} + +Imposta la maschera dei log al valore specificato. + +\bodydesc{La funzione restituisce il precedente valore.} +\end{prototype} + +Le routine di gestione mantengono per ogni processo una maschera che +determina quale delle chiamate effettuate a \func{syslog} verrà +effettivamente registrata. La registrazione viene disabilitata per tutte +quelle priorità che non rientrano nella maschera; questa viene settata +usando la macro \code{LOG\_MASK(p)} dove \code{p} è una delle costanti di +\secref{tab:sess_syslog_priority}. É inoltre disponibile anche la macro +\code{LOG\_UPTO(p)} che permette di specificare automaticamente tutte le +priorità fino ad un certo valore. \section{L'I/O su terminale} \label{sec:sess_terminal_io} -Esamineremo in questa sezione le peculiarità dell'I/O eseguito sui terminali, -tenendo conto delle differenze che quest'ultimi presentano rispetto ai normali -file su disco. +Benché come ogni altro dispositivo i terminali siano accessibili come file, +essi hanno assunto storicamente (essendo stati a lungo l'unico modo di +accedere al sistema) una loro rilevanza specifica, che abbiamo già avuto modo +di incontrare nella precedente sezione. + +Esamineremo qui le peculiarità dell'I/O eseguito sui terminali, che per la +loro particolare natura presenta delle differenze rispetto ai normali file su +disco e agli altri dispositivi. + + + +\subsection{L'architettura} +\label{sec:term_design} + + +I terminali sono una classe speciale di dispositivi a caratteri (si rammenti +la classificazione di \secref{sec:file_file_types}); un terminale ha infatti +una caratteristica che lo contraddistingue da un qualunque altro dispositivo, +e cioè che è destinato a gestire l'interazione con un utente (deve essere in +grado di fare da terminale di controllo per una sessione), che comportano la +presenza di ulteriori capacità. + +L'interfaccia per i terminali è una delle più oscure e complesse, essendosi +stratificata dagli inizi dei sistemi Unix fino ad oggi. Questo comporta una +grande quantità di opzioni e controlli relativi ad un insieme di +caratteristiche (come ad esempio la velocità della linea) necessarie per +dispositivi, come i terminali seriali, che al giorno d'oggi sono praticamente +in disuso. + +Storicamente i primi terminali erano appunto terminali di telescriventi +(\textit{teletype}), da cui deriva sia il nome dell'interfaccia, \textit{TTY}, +che quello dei relativi file di dispositivo, che sono sempre della forma +\texttt{/dev/tty*}.\footnote{ciò vale solo in parte per i terminali virtuali, + essi infatti hanno due lati, un \textit{master}, che può assumere i nomi + \file{/dev/pty[p-za-e][0-9a-f]} ed un corrispondente \textit{slave} con nome + \file{/dev/tty[p-za-e][0-9a-f]}.} Oggi essi includono le porte seriali, le +console virtuali dello schermo, i terminali virtuali che vengono creati come +canali di comunicazione dal kernel e che di solito vengono associati alle +connessioni di rete (ad esempio per trattare i dati inviati con \cmd{telnet} o +\cmd{ssh}). + +% In generale tutti i terminali hanno un insieme di funzionalità comuni, che +% vengono chiamate \textsl{discipline di linea}; esse contraddistinguono le +% modalità con cui il kernel manipola (ad esempio la reazione ad un carattere di +% cancellazione per la tastiera, o la gestione della linea tramite PPP o SLIP) i +% dati grezzi che vengono immessi sul dispositivo; + + +L'I/O sui terminali si effettua con le stesse modalità dei file normali, si +apre il relativo file di dispositivo, e si leggono e scriveno i dati con le +usuali funzioni di lettura e scrittura, occorre però tenere conto delle loro +caratteristiche specifiche, essi infatti prevedono due modalità di operazione, +dette rispettivamente \textsl{modo canonico} e \textsl{modo non canonico}, che +prevedono 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 +linea;\footnote{per cui eseguendo una \func{read} su un terminale in modo + canonico la funzione si bloccherà, anche se si sono scritti dei caratteri, + 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 \secref{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 +editor ad esempio) che necessitano di poter leggere un carattere alla volta e +che gestiscono al loro interno i vari comandi. + +La struttura dell'I/O, come di solito viene gestito dal driver del terminale è +mostrata in \secref{fig:term_struct} + +\begin{figure}[htb] + \centering + \includegraphics[width=13cm]{img/term_struct} + \caption{Struttura interna generica di un driver per un terminale.} + \label{fig:term_struct} +\end{figure} + + +L'I/O viene controllato attraverso una serie di attributi mantenuti per +ciascun terminale in una struttura \var{termios}, i cui campi + + + +\begin{figure}[!htb] + \footnotesize \centering + \begin{minipage}[c]{15cm} + \begin{lstlisting}[labelstep=0]{} +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 chars */ +}; + \end{lstlisting} + \end{minipage} + \normalsize + \caption{La struttura \var{termios}, che identifica le proprietà di un + terminale.} + \label{fig:term_termios} +\end{figure} + + + +\subsection{Il \textsl{modo canonico}} +\label{sec:term_canonic_mode} + +Il modo canonico + + +\subsection{Il \textsl{modo non canonico}} +\label{sec:term_noncanonic_mode} + +Il modo non canonico