Sistemati alcuni paragrafi, aggiunta unlink
authorSimone Piccardi <piccardi@gnulinux.it>
Tue, 8 May 2001 16:39:23 +0000 (16:39 +0000)
committerSimone Piccardi <piccardi@gnulinux.it>
Tue, 8 May 2001 16:39:23 +0000 (16:39 +0000)
filedir.tex
fileintro.tex

index f68576f0cb859b5d5ea18e4c03aaffe3411b0e2c..eaee40933274723ab566639c41682f61a0438710 100644 (file)
@@ -100,59 +100,58 @@ disposizione per i dati e le directory.
   \label{fig:filedir_disk_filesys}
 \end{figure}
 
   \label{fig:filedir_disk_filesys}
 \end{figure}
 
-Se si va ad esaminare come è strutturata l'informazione all'interno del
-filesystem (tralasciando le parti che non riguardano direttamente la gestione
-di file e directory come il super-block) avremo una situazione del tipo di
-quella esposta in \nfig.
-
+Se si va ad esaminare come è strutturata l'informazione all'interno di un
+singolo filesystem (tralasciando le parti connesse alla strutturazione e al
+funzionamento del filesystem stesso come il super-block) avremo una situazione
+del tipo di quella esposta in \nfig.
 \begin{figure}[htb]
   \centering
   
   \caption{Organizzazione di un filesystem}
   \label{fig:filedir_filesys_detail}
 \end{figure}
 \begin{figure}[htb]
   \centering
   
   \caption{Organizzazione di un filesystem}
   \label{fig:filedir_filesys_detail}
 \end{figure}
-
-
-Quanto mostrato in \curfig\ mette in evidenza alcune caratteristiche di un 
-filesystem unix su cui è bene porre attenzione in quanto sono fondamentali per
-capire il funzionamento delle funzioni che manipolano i file e le directory su
-cui torneremo fra poco; in particolare è opportuno ricordare sempre che:
+da questa figura si evidenzano alcune caratteristiche su cui è bene porre
+attenzione in quanto sono fondamentali per capire il funzionamento delle
+funzioni che manipolano i file e le directory su cui torneremo fra poco; in
+particolare è opportuno ricordare sempre che:
 
 \begin{itemize}
   
 \item L'\textit{inode} contiene tutte le informazioni riguardanti il file: il
   tipo di file, i permessi di accesso, le dimensioni, i puntatori ai blocchi
   fisici che contengono i dati e così via; le informazioni che la funzione
 
 \begin{itemize}
   
 \item L'\textit{inode} contiene tutte le informazioni riguardanti il file: il
   tipo di file, i permessi di accesso, le dimensioni, i puntatori ai blocchi
   fisici che contengono i dati e così via; le informazioni che la funzione
-  \texttt{stat} fornisce provengono dall'inode; dentro una directory si
-  troverà solo il nome del file e il numero dell'inode ad esso associato, cioè
-  una \textit{dentry}.
+  \texttt{stat} fornisce provengono dall'\textit{inode}; dentro una directory
+  si troverà solo il nome del file e il numero dell'\textit{inode} ad esso
+  associato, cioè quella che da qui in poi chiameremo una \textit{dentry}.
   
   
-\item Come mostrato in \curfig si possono avere più dentries che puntano allo
-  stesso inode. Ogni inode ha un contatore che contiene il numero di
-  riferimenti (\textit{link count}) che sono stati fatti ad esso, solo quando
-  questo contatore si annulla il file può essere cancellato. Per questo in
-  generale non esiste una funzione che cancelli un file, ma solo la funzione
-  \texttt{unlink} che si chiama così proprio perché che toglie un riferimento
-  da una directory (cancellando la dentry), il che non comporta
-  automaticamente pure la eliminazione dei blocchi sul disco.
+\item Come mostrato in \curfig si possono avere più \textit{dentries} che
+  puntano allo stesso \textit{inode}. Ogni \textit{inode} ha un contatore che
+  contiene il numero di riferimenti (\textit{link count}) che sono stati fatti
+  ad esso, solo quando questo contatore si annulla i dati del file vengono
+  effettivamente rimossi dal disco. Per questo la funzione per cancellare un
+  file si chiama \texttt{unlink}, ed in realtà non cancella affatto i dati del
+  file, ma si limita a eliminare la \textit{dentry} da una directory e
+  decrementare il numero di riferimenti nell'\textit{inode}.
+  
+\item Il numero di \textit{inode} nella \textit{dentry} si riferisce ad un
+  \textit{inode} nello stesso filesystem e non ci può essere una directory che
+  contiene riferimenti ad \textit{inodes} relativi ad altri filesystem. Questo
+  limita l'uso del comando \texttt{ln} (che crea una nuova dentry per un file
+  esistente, con la funzione \texttt{link}) al filesystem corrente.
   
   
-\item Siccome il numero di inode nella dentry si riferisce ad un inode nello
-  stesso filesystem non ci può essere una directory che contiene riferimenti
-  ad inodes relativi ad altri filesystem, questo limita l'uso del comando
-  \texttt{ln} (che crea una nuova dentry per un file esistente, con la
-  funzione \texttt{link}) al filesystem corrente.
-
 \item Quando si cambia nome ad un file senza cambiare filesystem il contenuto
 \item Quando si cambia nome ad un file senza cambiare filesystem il contenuto
-  del file non deve essere spostato, ma basta creare una nuova dentry per
-  l'inode in questione rimuovendo la vecchia (che è la modalità in cui opera
-  normalmente il comando \texttt{mv} attraveso la funzione \texttt{rename}).
+  del file non deve essere spostato, viene semplicemente creta una nuova
+  \textit{dentry} per l'\textit{inode} in questione e rimossa la vecchia
+  (questa è la modalità in cui opera normalmente il comando \texttt{mv}
+  attraverso la funzione \texttt{rename}).
 
 \end{itemize}
 
 
 \end{itemize}
 
-Infine è bene avere presente che esiste un numero di riferimenti anche per le
-directories, se a partire dalla situazione mostrata in \curfig\ creiamo una
-nuova directory \texttt{textdir} avremo una situazione come quella in \nfig,
-dove per chiarezza abbiamo aggiunto dei numeri di inode.
+Infine è bene avere presente che essendo file pure loro, esiste un numero di
+riferimenti anche per le directories; per cui se ad esempio a partire dalla
+situazione mostrata in \curfig\ creiamo una nuova directory \texttt{textdir}
+nella directory corrente avremo una situazione come quella in \nfig, dove per
+chiarezza abbiamo aggiunto dei numeri di inode.
 
 La nuova directory avrà allora un numero di riferimenti pari a due, in quanto
 è referenziata dalla directory da cui si era partiti (in cui è inserita la
 
 La nuova directory avrà allora un numero di riferimenti pari a due, in quanto
 è referenziata dalla directory da cui si era partiti (in cui è inserita la
@@ -173,31 +172,80 @@ ambiente unix, dove tali collegamenti sono usualmente chiamati \textit{link},
 ma data la struttura del sistema ci sono due metodi sostanzialmente diversi
 per fare questa operazione.
 
 ma data la struttura del sistema ci sono due metodi sostanzialmente diversi
 per fare questa operazione.
 
-Come si è appena visto l'accesso al contenuto di un file su disco avviene
-attraverso il suo \textit{inode}, e il nome che si trova in una directory è
-solo una etichetta associata ad un puntatore a detto inode.  Questo significa
-che la realizzazione di un link è immediata in quanto uno stesso file può
-avere tanti nomi diversi allo stesso tempo, dati da altrettante diverse
-associazioni allo stesso inode; si noti poi che nessuno di questi nomi viene
-ad assumere una particolare preferenza rispetto agli altri.
+Come si è appena detto l'accesso al contenuto di un file su disco avviene
+attraverso il suo inode, e il nome che si trova in una directory è solo una
+etichetta associata ad un puntatore a detto inode.  Questo significa che la
+realizzazione di un link è immediata in quanto uno stesso file può avere tanti
+nomi diversi allo stesso tempo, dati da altrettante diverse associazioni allo
+stesso inode; si noti poi che nessuno di questi nomi viene ad assumere una
+particolare preferenza rispetto agli altri.
 
 Per aggiungere un nome ad un inode si utilizza la funzione \texttt{link}; si
 suole chiamare questo tipo di associazione un collegamento diretto (o
 
 Per aggiungere un nome ad un inode si utilizza la funzione \texttt{link}; si
 suole chiamare questo tipo di associazione un collegamento diretto (o
-\textit{hard link}).  La creazione di un nuovo link diretto non copia il
-contenuto del file, ma si limita ad aumentare di uno il numero di referenze al
-file aggiungendo il nuovo nome ai precedenti. Si noti che uno stesso file può
-essere così richiamato in diverse directory.
-
+\textit{hard link}).  Il prototipo della funzione, definita in
+\texttt{unistd.h} è il seguente:
 \begin{itemize}
 \item \texttt{int link(const char * oldname, const char * newname)}
   
 \begin{itemize}
 \item \texttt{int link(const char * oldname, const char * newname)}
   
-  Crea un nuovo link diretto al file indicato da \texttt{oldname} dandogli
-  nome \texttt{newname}.
+  Crea un nuovo collegamento diretto al file indicato da \texttt{oldname}
+  dandogli nome \texttt{newname}.
   
   La funzione restituisce zero in caso di successo e -1 per un errore, in caso
   
   La funzione restituisce zero in caso di successo e -1 per un errore, in caso
-  di errore. La variabile \texttt{errno} viene settata secondo i codici di
-  errore standard di accesso ai files (trattati in dettaglio in
-  \ref{sec:filedir_access_control}) ai quali si aggiungono i seguenti:
+  di errore. La variabile \texttt{errno} viene settata secondo i seguenti
+  codici di errore:
+
+  \begin{itemize}
+  \item \texttt{EXDEV} \texttt{oldname} e \texttt{newname} non sono sullo
+    stesso filesystem.
+  \item \texttt{EPERM} il filesystem che contiene \texttt{oldname} e
+    \texttt{newname} non supporta i link diretti.
+  \item \texttt{EACCESS} 
+    Non c'è il permesso di scrittura per la directory in cui si vuole creare
+    il nuovo link.
+  \item \texttt{EEXIST} Un file (o una directory) con quel nome esiste di
+    già.
+  \item \texttt{EMLINK} Ci sono troppi link al file \texttt{oldname} (il
+    numero massimo è specificato dalla variabile \texttt{LINK\_MAX}, vedi
+    \ref{sec:xxx_limits}.
+  \item \texttt{ENOSPC} La directory in cui si vuole creare il link è piena e
+    non può essere ampliata.
+  \item \texttt{EROFS} La directory su cui si vuole inserire il nuovo link è
+    su un filesystem montato readonly.
+  \end{itemize}
+\end{itemize}
+
+La creazione di un nuovo collegamento diretto non copia il contenuto del file,
+ma si limita ad aumentare di uno il numero di referenze al file aggiungendo il
+nuovo nome ai precedenti. Si noti che uno stesso file può essere così
+richiamato in diverse directory.
+Per quanto dicevamo in \ref{sec:filedir_filesystem} la creazione del
+collegamento diretto è possibile solo se entrambi i pathname sono nello stesso
+filesytem; inoltre il filesystem deve supportare i collegamenti diretti (non è
+il caso ad esempio del filesystem \texttt{vfat} di windows).
+
+La funzione opera sui file ordinari, come sugli altri oggetti del filesystem,
+ma solo l'amministratore è in grado di creare un collegamento diretto ad
+un'altra directory, questo lo si fa perché in questo caso è possibile creare
+dei cerchi nel filesystem (vedi \ref{sec:filedir_symlink}) che molti programmi
+non sono in grado di gestire e la cui rimozione diventa estremamente
+complicata (in genere occorre far girare il programma \texttt{fsck} per
+riparare il filesystem).
+
+
+La rimozione di un file (o più precisamente di una sua dentry) si effettua con
+la funzione \texttt{unlink}; il suo prototipo, definito in \texttt{unistd.h} è
+il seguente:
+
+\begin{itemize}
+\item \texttt{int unlink(const char * filename)}
+  
+  Cancella il nome specificato dal pathname nella relativa directory e
+  decrementa il numero di riferimenti nel relativo inode.
+  
+  La funzione restituisce zero in caso di successo e -1 per un errore, in caso
+  di errore. La variabile \texttt{errno} viene settata secondo i seguenti
+  codici di errore:
 
   \begin{itemize}
   \item \texttt{EXDEV} \texttt{oldname} e \texttt{newname} non sono sullo
 
   \begin{itemize}
   \item \texttt{EXDEV} \texttt{oldname} e \texttt{newname} non sono sullo
@@ -219,6 +267,19 @@ essere cos
   \end{itemize}
 \end{itemize}
 
   \end{itemize}
 \end{itemize}
 
+Per cancellare 
+
+
+
+
+
+Una delle caratteristiche di queste funzioni è che la creazione/rimozione
+della nnome dalla directory e l'incremento/decremento del numero di
+riferimenti nell'inode deve essere una operazione atomica (cioè non
+interrompibile da altri) processi, per questo entrambe queste funzioni sono
+realizzate tramite una singola system call.
+
+
 
 
 \subsection{Le funzioni \texttt{remove} e \texttt{rename}}
 
 
 \subsection{Le funzioni \texttt{remove} e \texttt{rename}}
@@ -251,8 +312,8 @@ funzioni apposite, come la \texttt{readlink} e la \texttt{lstat} per accedere
 alle informazioni del link invece che a quelle del file a cui esso fa
 riferimento.
 
 alle informazioni del link invece che a quelle del file a cui esso fa
 riferimento.
 
-Le funzioni per operare sui link sono le seguenti, esse sono tutte dichiarate
-nell'header file \texttt{unistd.h}.
+Le funzioni per operare sui link simbolici sono le seguenti, esse sono tutte
+dichiarate nell'header file \texttt{unistd.h}.
 
 \begin{itemize}
 \item \texttt{int symlink(const char * oldname, const char * newname)}
 
 \begin{itemize}
 \item \texttt{int symlink(const char * oldname, const char * newname)}
@@ -419,15 +480,13 @@ per cambiare directory di lavoro.
 
 
 
 
 
 
+
+
+
 \section{La manipolazione delle caratteristiche dei files}
 \label{sec:filedir_infos}
 
 
 \section{La manipolazione delle caratteristiche dei files}
 \label{sec:filedir_infos}
 
 
-Si ricordi che in 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.
 
 
 \subsection{Le funzioni \texttt{stat}, \texttt{fstat} e \texttt{lstat}}
 
 
 \subsection{Le funzioni \texttt{stat}, \texttt{fstat} e \texttt{lstat}}
index dfd3081dc67781aa9984a8052d20dc99818db1ea..bc08ca9a92f230fbd32f3e232ea8cf3c89e44ddc 100644 (file)
@@ -375,3 +375,9 @@ in cui il processo 
 Ritorneremo su questo più avanti, quando tratteremo l'input/output sui file,
 esaminando in dettaglio come tutto ciò viene realizzato.
 
 Ritorneremo su questo più avanti, quando tratteremo l'input/output sui file,
 esaminando in dettaglio come tutto ciò viene realizzato.
 
+Si ricordi infine che in 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.
+