Aggiunta spiegazione sui file di dispositivo, figura sui terminali.
authorSimone Piccardi <piccardi@gnulinux.it>
Mon, 7 Oct 2002 14:24:25 +0000 (14:24 +0000)
committerSimone Piccardi <piccardi@gnulinux.it>
Mon, 7 Oct 2002 14:24:25 +0000 (14:24 +0000)
biblio.bib
fileintro.tex
img/term_struct.dia [new file with mode: 0644]
session.tex

index ef0d882..f30a1c2 100644 (file)
@@ -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 =    {},
index 77dae72..359a1e2 100644 (file)
@@ -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 (file)
index 0000000..e3d833a
Binary files /dev/null and b/img/term_struct.dia differ
index f1b009b..10129fa 100644 (file)
@@ -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