From: Simone Piccardi Date: Mon, 7 Oct 2002 14:24:25 +0000 (+0000) Subject: Aggiunta spiegazione sui file di dispositivo, figura sui terminali. X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=commitdiff_plain;h=999678703d956565dbc4c1707482e9114026be82 Aggiunta spiegazione sui file di dispositivo, figura sui terminali. --- diff --git a/biblio.bib b/biblio.bib index ef0d882..f30a1c2 100644 --- a/biblio.bib +++ b/biblio.bib @@ -33,7 +33,7 @@ @Booklet{UnixFaq, title = {Unix Programming Frequently Asked Questions}, OPTkey = {}, - OPTauthor = {Andrew Gierth}, + author = {Andrew Gierth}, OPThowpublished = {http://www.erlenstar.demon.co.uk/unix/faq_toc.html}, OPTaddress = {}, OPTmonth = {}, diff --git a/fileintro.tex b/fileintro.tex index 77dae72..359a1e2 100644 --- a/fileintro.tex +++ b/fileintro.tex @@ -122,11 +122,26 @@ Come detto in precedenza, in Unix esistono vari tipi di file; in Linux questi sono implementati come oggetti del \textit{Virtual File System} (vedi \secref{sec:file_vfs_work}) e sono presenti in tutti i filesystem unix-like utilizzabili con Linux. L'elenco dei vari tipi di file definiti dal -\textit{Virtual File System}\index{Virtual File System} è riportato in \ntab. +\textit{Virtual File System}\index{Virtual File System} è riportato in +\tabref{tab:file_file_types}. Si tenga ben presente che questa classificazione non ha nulla a che fare con -la classificazione sui tipi di file (che in questo caso sono sempre file di -dati) in base al loro contenuto, o tipo di accesso. +la classificazione dei file (che in questo caso sono sempre file di dati) in +base al loro contenuto, o tipo di accesso. Essa riguarda invece il tipo di +oggetti; in particolare è da notare la presenza dei cosiddetti file speciali. +Alcuni di essi, come le \textit{fifo} (che tratteremo in +\secref{sec:ipc_named_pipe}) ed i \textit{socket} (che tratteremo in +\capref{cha:socket_intro}) non sono altro che dei riferimenti per utilizzare +delle funzionalità di comunicazione fornite dal kernel. Gli altri sono i +\textsl{file di dispositivo} (o \textit{device file}) che costituiscono una +interfaccia diretta per leggere e scrivere sui dispositivi fisici; essi +vengono suddivisi in due grandi categorie, \textsl{a blocchi} e \textsl{a + caratteri} a seconda delle modalità in cui il dispositivo sottostante +effettua le operazioni di I/O.\footnote{in sostanza i dispositivi a blocchi + (ad esempio i dischi) corrispondono a periferiche per le quali è richiesto + che l'I/O venga effettuato per blocchi di dati di dimensioni fissate (ad + esempio le dimensioni di un settore), mentre nei dispositivi a caratteri + l'I/O viene effettuato senza nessuna particolare struttura.} \begin{table}[htb] \footnotesize @@ -159,16 +174,20 @@ dati) in base al loro contenuto, o tipo di accesso. \label{tab:file_file_types} \end{table} -Infatti una delle differenze principali con altri sistemi operativi (come il -VMS o Windows) è che per Unix tutti i file di dati sono identici e contengono -un flusso continuo di byte. Non esiste cioè differenza per come vengono visti -dal sistema file di diverso contenuto o formato (come nel caso di quella fra -file di testo e binari che c'è in Windows) né c'è una strutturazione a record -per il cosiddetto ``accesso diretto'' come nel caso del VMS.\footnote{con i - kernel della serie 2.4 è disponibile, attraverso dei device file appositi, - una forma di accesso diretto ai dischi (il \textit{raw access}) che però non - ha nulla a che fare con questo, trattandosi solo di operazioni fatte senza - passare attraverso un filesystem.} +Una delle differenze principali con altri sistemi operativi (come il VMS o +Windows) è che per Unix tutti i file di dati sono identici e contengono un +flusso continuo di byte. Non esiste cioè differenza per come vengono visti dal +sistema file di diverso contenuto o formato (come nel caso di quella fra file +di testo e binari che c'è in Windows) né c'è una strutturazione a record per +il cosiddetto ``accesso diretto'' come nel caso del VMS.\footnote{questo vale + anche per i dispositivi a blocchi: la strutturazione dell'I/O in blocchi di + dimensione fissa avviene solo all'interno del kernel, ed è completamente + trasparente all'utente. Inoltre talvolta si parla di \textsl{accesso + diretto} riferendosi alla capacità, che non ha niente a che fare con tutto + ciò, di effettuare, attraverso degli appositi file di dispositivo, + operazioni di I/O direttamente sui dischi senza passare attraverso un + filesystem (il cosiddetto \textit{raw access}, introdotto coi kernel della + serie 2.4.x).} Una seconda differenza è nel formato dei file ASCII: in Unix la fine riga è codificata in maniera diversa da Windows o Mac, in particolare il fine riga è @@ -179,12 +198,21 @@ del Mac e del \texttt{CR LF} di Windows.\footnote{per questo esistono in Linux problemi qualora nei programmi si facciano assunzioni sul terminatore della riga. -Si ricordi infine che in ambiente Unix non esistono tipizzazioni dei file di -dati e che non c'è nessun supporto del sistema per le estensioni come parte -del filesystem. Ciò nonostante molti programmi adottano delle convenzioni per -i nomi dei file, ad esempio il codice C normalmente si mette in file con -l'estensione \file{.c}, ma questa è, per quanto usata ed accettata in maniera -universale, solo una convenzione. +Si ricordi infine che un kernel Unix non fornisce nessun supporto per la +tipizzazione dei file di dati e che non c'è nessun supporto del sistema per le +estensioni come parte del filesystem.\footnote{non è così ad esempio nel + filesystem HFS dei Mac, che supporta delle risorse associate ad ogni file, + che specificano fra l'altro il contenuto ed il programma da usare per + leggerlo. In realtà per alcuni filesystem, come l'XFS della SGI, esiste la + possibilità di associare delle risorse ai file, ma è una caratteristica + tutt'ora poco utilizzata, dato che non corrisponde al modello classico dei + file in un sistema Unix.} Ciò nonostante molti programmi adottano delle +convenzioni per i nomi dei file, ad esempio il codice C normalmente si mette +in file con l'estensione \file{.c}; un'altra tecnica molto usata è quella di +utilizzare i primi 4 byte del file per memorizzare un \textit{magic number} +che classifichi il contenuto; entrambe queste tecniche, per quanto usate ed +accettate in maniera diffusa, restano solo delle convenzioni il cui rispetto è +demandato alle applicazioni stesse. \subsection{Le due interfacce ai file} diff --git a/img/term_struct.dia b/img/term_struct.dia new file mode 100644 index 0000000..e3d833a Binary files /dev/null and b/img/term_struct.dia differ diff --git a/session.tex b/session.tex index f1b009b..10129fa 100644 --- a/session.tex +++ b/session.tex @@ -495,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 @@ -740,29 +736,31 @@ identificano ciascuna categoria sono riportati in specificato con un OR aritmetico. \begin{table}[htb] -\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\\ + \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}.} @@ -776,6 +774,7 @@ 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 @@ -831,25 +830,27 @@ specificabile attraverso le costanti riportate in con la maschera binaria delle costanti di \tabref{tab:sess_syslog_facility}. \begin{table}[htb] -\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} + \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 @@ -887,6 +888,115 @@ 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 + + + %%% Local Variables: %%% mode: latex