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 ef0d88229a5cac754d1798439dfd40f5f9026ae1..f30a1c250c05c4fb9d18f88a86919b147fb7e5cf 100644 (file)
@@ -33,7 +33,7 @@
 @Booklet{UnixFaq,
   title =       {Unix Programming Frequently Asked Questions},
   OPTkey =      {},
 @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 =    {},
   OPThowpublished = {http://www.erlenstar.demon.co.uk/unix/faq_toc.html},
   OPTaddress =          {},
   OPTmonth =    {},
index 77dae72993695399d43891dbae771aecd96ab044..359a1e26391e07f38de5b5186c64638d215997e8 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
 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
 
 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
 
 \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}
 
     \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 è
 
 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.
 
 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}
 
 
 \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 f1b009b2a8f312f82d87c37707b4303d06d98697..10129fa70b7f24995a3b0262ce3ed71e126a2520 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
 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
 
 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]
 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}.}
 \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]
 \tabref{tab:sess_openlog_option}.
 
 \begin{table}[htb]
+  \footnotesize
 \centering
 \begin{tabular}[c]{|l|p{8cm}|}
 \hline
 \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]
 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
 \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
 
 %%% Local Variables: 
 %%% mode: latex