Correzioni parte seconda. Tolto un pezzo duplicato
[gapil.git] / fileintro.tex
index 927dc4da827076a43c36d233593b5aa7e2d8d5cd..010add3be64c39094d05bed03863814924d91641 100644 (file)
@@ -22,7 +22,7 @@ delle modalit
 
 
 
-\section{L'architettura dell'accesso}
+\section{L'architettura generale}
 \label{sec:file_access_arch}
 
 Per poter accedere ai file il kernel deve mettere a disposizione dei programmi
@@ -30,8 +30,9 @@ le opportune interfacce che consentano di leggerne il contenuto; il sistema
 cioè deve provvedere ad organizzare e rendere accessibile in maniera opportuna
 l'informazione tenuta sullo spazio grezzo disponibile sui dischi. Questo viene
 fatto strutturando l'informazione sul disco attraverso quello che si chiama un
-\textit{filesystem}, essa poi viene resa disponibile ai processi attraverso
-quello che viene chiamato il \textsl{montaggio} del filesystem.
+\textit{filesystem} (vedi \ref{sec:file_arch_func}), essa poi viene resa
+disponibile ai processi attraverso quello che viene chiamato il
+\textsl{montaggio} del \textit{filesystem}.
 % (approfondiremo tutto ciò in \secref{sec:file_arch_func}).
 
 In questa sezione faremo una panormamica generica su come il sistema presenta
@@ -52,15 +53,15 @@ viene identificato dall'utente usando quello che viene chiamato
   ricerca (come quello in cui si cercano i comandi) non seguiremo questa
   scelta dato che l'uso della parola \textit{pathname} è ormai così comune che
   mantenerne l'uso è senz'altro più chiaro dell'alternativa proposta.}, cioè
-il percorso che si deve fare per accedere al file, che è composto da una serie
-di nomi separati da una \file{/}.
+il percorso che si deve fare per accedere al file a partire dalla \textit{root
+  directory}, che è composto da una serie di nomi separati da una \file{/}.
 
-Dopo la fase di inizializzazione il kernel riceve dal boot loader
-l'indicazione di quale dispositivo contiene il filesystem da usare come punto
-di partenza e questo viene montato come radice dell'albero (cioè nella
-directory \file{/}); tutti gli ulteriori filesystem che possono essere su
-altri dispositivi devono poi essere inseriti nell'albero montandoli su
-opportune directory del filesystem montato come radice.
+All'avvio del sistema, comletata la fase di inizializzazione il kernel riceve
+dal boot loader l'indicazione di quale dispositivo contiene il filesystem da
+usare come punto di partenza e questo viene montato come radice dell'albero
+(cioè nella directory \file{/}); tutti gli ulteriori filesystem che possono
+essere su altri dispositivi dovranno poi essere inseriti nell'albero
+montandoli su opportune directory del filesystem montato come radice.
 
 Alcuni filesystem speciali (come \file{/proc} che contiene un'interfaccia ad
 alcune strutture interne del kernel) sono generati automaticamente dal kernel
@@ -87,7 +88,7 @@ Il nome completo di un file viene chiamato \textit{pathname} ed il
 procedimento con cui si individua il file a cui esso fa riferimento è chiamato
 risoluzione del nome (\textit{file name resolution} o \textit{pathname
   resolution}).  La risoluzione viene fatta esaminando il \textit{pathname} da
-destra a sinistra e localizzando ogni nome nella directory indicata dal nome
+sinistra a destra e localizzando ogni nome nella directory indicata dal nome
 precedente usando \file{/} come separatore\footnote{nel caso di nome vuoto, il
   costrutto \file{//} viene considerato equivalente a \file{/}.}: ovviamente
 perché il procedimento funzioni occorre che i nomi indicati come directory
@@ -113,7 +114,7 @@ questa sia la directory radice allora il riferimento 
 \subsection{I tipi di file}
 \label{sec:file_file_types}
 
-Come detto in precedenza in unix esistono vari tipi di file, in Linux questi
+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
@@ -142,10 +143,10 @@ dati) in base al loro contenuto, o tipo di accesso.
       un file che identifica una periferica ad accesso sequenziale \\
       \textit{block device} & \textsl{dispositivo a blocchi} &
       un file che identifica una periferica ad accesso diretto \\
-      \textit{fifo} & \textsl{tubo} &
+      \textit{fifo} & \textsl{``tubo''} &
       un file speciale che identifica una linea di comunicazione software
       (unidirezionale) \\
-      \textit{socket} & \textsl{manicotto} &
+      \textit{socket} & \textsl{``spina''} &
       un file speciale che identifica una linea di comunicazione software
       (bidirezionale) \\
     \hline
@@ -171,18 +172,26 @@ 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ò non ostante 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 è, appunto, solo una convenzione.
+
+
 
 \subsection{Le due interfacce ai file}
 \label{sec:file_io_api}
 
-In unix le modalità di accesso ai file e le relative interfacce di
+In Linux le modalità di accesso ai file e le relative interfacce di
 programmazione sono due, basate su due diversi meccanismi con cui è possibile
 accedere al loro contenuto.
 
-La prima è l'interfaccia standard di unix, quella che il manuale delle
+La prima è l'interfaccia standard di Unix, quella che il manuale delle
 \acr{glibc} chiama interfaccia dei descrittori di file (o \textit{file
-  descriptor}).  È un'interfaccia specifica di unix e provvede un accesso non
-bufferizzato, la tratteremo in dettaglio in \capref{cha:file_unix_interface}.
+  descriptor}).  È un'interfaccia specifica dei sistemi unix-like e provvede
+un accesso non bufferizzato; la tratteremo in dettaglio in
+\capref{cha:file_unix_interface}.
 
 L'interfaccia è primitiva ed essenziale, l'accesso viene detto non
 bufferizzato in quanto la lettura e la scrittura vengono eseguite chiamando
@@ -194,8 +203,8 @@ L'interfaccia 
 
 La seconda interfaccia è quella che il manuale della \acr{glibc} chiama degli
 \textit{stream}\index{stream}, essa provvede funzioni più evolute e un accesso
-bufferizzato (controllato dalla implementazione fatta dalle librerie del C),
-la tratteremo in dettaglio in \capref{cha:files_std_interface}.
+bufferizzato (controllato dalla implementazione fatta dalle \acr{glibc}), la
+tratteremo in dettaglio nel \capref{cha:files_std_interface}.
 
 Questa è l'interfaccia standard specificata dall'ANSI C e perciò si trova
 anche su tutti i sistemi non Unix. Gli \textit{stream} sono oggetti complessi
@@ -205,22 +214,21 @@ tipo \type{FILE *}.  L'interfaccia 
 
 Entrambe le interfacce possono essere usate per l'accesso ai file come agli
 altri oggetti del VFS (pipe, socket, device, sui quali torneremo in dettaglio
-a tempo opportuno), ma per poter accedere alle operazioni di controllo sul
-particolare tipo di oggetto del VFS scelto occorre usare l'interfaccia
-standard di Unix coi \textit{file descriptor}. Allo stesso modo devono essere
-usati i \textit{file descriptor} se si vuole ricorrere a modalità speciali di
-I/O come il polling o il non-bloccante (vedi \capref{cha:file_advanced}).
+a tempo opportuno), ma per poter accedere alle operazioni di controllo su un
+qualunque tipo di oggetto del VFS occorre usare l'interfaccia standard di Unix
+coi \textit{file descriptor}. Allo stesso modo devono essere usati i
+\textit{file descriptor} se si vuole ricorrere a modalità speciali di I/O come
+il polling o il non-bloccante (vedi \capref{cha:file_advanced}).
 
 Gli \textit{stream} forniscono un'interfaccia di alto livello costruita sopra
-quella dei \textit{file descriptor}, che tratta tutti i file nello stesso
-modo, con l'eccezione di poter scegliere tra diversi stili di bufferizzazione.
-Il maggior vantaggio degli \textit{stream} è che l'interfaccia per le
-operazioni di input/output è enormemente più ricca di quella dei \textit{file
-  descriptor}, che provvedono solo funzioni elementari per la
-lettura/scrittura diretta di blocchi di byte.  In particolare gli
-\textit{stream} dispongono di tutte le funzioni di formattazione per l'input e
-l'output adatte per manipolare anche i dati in forma di linee o singoli
-caratteri.
+quella dei \textit{file descriptor}, che permette di poter scegliere tra
+diversi stili di bufferizzazione.  Il maggior vantaggio degli \textit{stream}
+è che l'interfaccia per le operazioni di input/output è enormemente più ricca
+di quella dei \textit{file descriptor}, che provvedono solo funzioni
+elementari per la lettura/scrittura diretta di blocchi di byte.  In
+particolare gli \textit{stream} dispongono di tutte le funzioni di
+formattazione per l'input e l'output adatte per manipolare anche i dati in
+forma di linee o singoli caratteri.
 
 In ogni caso, dato che gli stream sono implementati sopra l'interfaccia
 standard di Unix, è sempre possibile estrarre il \textit{file descriptor} da
@@ -229,66 +237,60 @@ tempo uno \textit{stream} ad un \textit{file descriptor}.
 
 In generale, se non necessitano specificatamente le funzionalità di basso
 livello, è opportuno usare sempre gli \textit{stream} per la loro maggiore
-portabilità essendo questi ultimi definiti nello standard ANSI C;
-l'interfaccia con i \textit{file descriptor} invece segue solo lo standard
-POSIX.1 dei sistemi unix ed è pertanto di portabilità più limitata.
-
-
-\subsection{Caratteristiche specifiche dei file in Unix}
-\label{sec:fileint_unix_spec}
-
-Essendo un sistema multitasking e multiutente esistono alcune caratteristiche
-specifiche di un sistema unix-like che devono essere tenute in conto
-nell'accesso ai file. È infatti normale che più processi o programmi possano
-accedere contemporaneamente allo stesso file e devono poter eseguire le loro
-operazioni indipendentemente da quello che fanno gli altri processi.
-
-Per questo motivo le strutture usate per all'accesso ai file sono relative al
-processo che effettua l'accesso.  All'apertura di ogni file infatti viene
-creata all'interno del processo una apposita struttura in cui sono memorizzati
-tutti gli attributi del medesimo, che viene utilizzata per tutte le
-operazioni. Questa è una struttura che resta locale al processo stesso; in
-questo modo processi diversi possono usare le proprie strutture locali per
-accedere ai file (che può essere sempre lo stesso) in maniera assolutamente
-indipendente.
-
-Questo ha delle conseguenze di cui è bene tenere conto; ad esempio in tutti i
-sistemi POSIX uno degli attributi di un file aperto è la posizione corrente nel
-file, cioè il punto nel file in cui verrebbe letto o scritto alla operazione
-successiva. Essa è rappresentata da un numero intero che indica il numero di
-byte dall'inizio del file, che viene (a meno che non si apra il file in
-append) inizializzato a zero all'apertura del medesimo.
-
-Questo è uno dei dati che viene mantenuto nella suddetta struttura, per cui
-ogni processo avrà la sua posizione corrente nel file, che non sarà
-influenzata da quello che altri processi possono fare. Anzi, aprire un file
-significa appunto creare ed inizializzare una tale struttura, per cui se si
-apre due volte lo stesso file all'interno dello stesso processo, si otterranno
-due file descriptor o due stream che avranno ancora una posizione corrente nel
-file assolutamente indipendente.
-
-Si tenga conto inoltre che un'altro dei dati contenuti nella struttura di
-accesso è un riferimento all'inode del file, pertanto anche se il file viene
-cancellato da un altro processo, sarà sempre possibile mantenere l'accesso ai
-dati, e lo spazio su disco non verrà rilasciato fintanto che il file non sarà
-chiuso e l'ultimo riferimento cancellato. È pertanto possibile (come vedremo
-in dettaglio in \secref{sec:file_link}) aprire un file provvisorio per
-cancellarlo immediatamente dopo; in questo modo all'uscita del programma il
-file scomparirà definitivamente dal disco, ma il file ed il suo contenuto
-saranno disponibili per tutto il tempo in cui il processo è attivo.
-
-Ritorneremo su questo più avanti in \secref{sec:file_fd}, quando tratteremo
-l'input/output sui file, esaminando in dettaglio come tutto ciò viene
-realizzato.
-
-Si ricordi infine che in ambiente unix non esistono i tipi di file e che non
-c'è nessun supporto per le estensioni come parte del filesystem. Ciò non
-ostante molti programmi adottano delle convenzioni per i nomi dei file, ad
-esempio il codice C normalmente si mette in file con l'estensione .c, ma
-questa è, appunto, solo una convenzione.
-
-
-\section{L'architettura di funzionamento}
+portabilità, essendo questi ultimi definiti nello standard ANSI C;
+l'interfaccia con i \textit{file descriptor} infatti segue solo lo standard
+POSIX.1 dei sistemi Unix, ed è pertanto di portabilità più limitata.
+
+
+% \subsection{Caratteristiche specifiche dei file in Unix}
+% \label{sec:fileint_unix_spec}
+
+% Essendo un sistema multitasking e multiutente esistono alcune caratteristiche
+% specifiche di un sistema unix-like che devono essere tenute in conto
+% nell'accesso ai file. È infatti normale che più processi o programmi possano
+% accedere contemporaneamente allo stesso file e devono poter eseguire le loro
+% operazioni indipendentemente da quello che fanno gli altri processi.
+
+% Per questo motivo le strutture usate per all'accesso ai file sono relative al
+% processo che effettua l'accesso.  All'apertura di ogni file infatti viene
+% creata all'interno del processo una apposita struttura in cui sono memorizzati
+% tutti gli attributi del medesimo, che viene utilizzata per tutte le
+% operazioni. Questa è una struttura che resta locale al processo stesso; in
+% questo modo processi diversi possono usare le proprie strutture locali per
+% accedere ai file (che può essere sempre lo stesso) in maniera assolutamente
+% indipendente.
+
+% Questo ha delle conseguenze di cui è bene tenere conto; ad esempio in tutti i
+% sistemi POSIX uno degli attributi di un file aperto è la posizione corrente nel
+% file, cioè il punto nel file in cui verrebbe letto o scritto alla operazione
+% successiva. Essa è rappresentata da un numero intero che indica il numero di
+% byte dall'inizio del file, che viene (a meno che non si apra il file in
+% append) inizializzato a zero all'apertura del medesimo.
+
+% Questo è uno dei dati che viene mantenuto nella suddetta struttura, per cui
+% ogni processo avrà la sua posizione corrente nel file, che non sarà
+% influenzata da quello che altri processi possono fare. Anzi, aprire un file
+% significa appunto creare ed inizializzare una tale struttura, per cui se si
+% apre due volte lo stesso file all'interno dello stesso processo, si otterranno
+% due file descriptor o due stream che avranno ancora una posizione corrente nel
+% file assolutamente indipendente.
+
+% Si tenga conto inoltre che un'altro dei dati contenuti nella struttura di
+% accesso è un riferimento all'inode del file, pertanto anche se il file viene
+% cancellato da un altro processo, sarà sempre possibile mantenere l'accesso ai
+% dati, e lo spazio su disco non verrà rilasciato fintanto che il file non sarà
+% chiuso e l'ultimo riferimento cancellato. È pertanto possibile (come vedremo
+% in dettaglio in \secref{sec:file_link}) aprire un file provvisorio per
+% cancellarlo immediatamente dopo; in questo modo all'uscita del programma il
+% file scomparirà definitivamente dal disco, ma il file ed il suo contenuto
+% saranno disponibili per tutto il tempo in cui il processo è attivo.
+
+% Ritorneremo su questo più avanti in \secref{sec:file_fd}, quando tratteremo
+% l'input/output sui file, esaminando in dettaglio come tutto ciò viene
+% realizzato.
+
+
+\section{L'architettura della gestione dei file}
 \label{sec:file_arch_func}
 
 Per capire fino in fondo le proprietà di file e directory in un sistema