X-Git-Url: https://gapil.gnulinux.it/gitweb/?a=blobdiff_plain;f=filedir.tex;h=c5f46756d453a2f904c6ceff6389c33f7401d6b6;hb=73d2d858e297b733923773d287b0079df449f044;hp=1928eb65bcf8458937e4cfcd6603fe77085cb02c;hpb=f38129d2f5315923568792875a9fa1fdb5e45d6e;p=gapil.git diff --git a/filedir.tex b/filedir.tex index 1928eb6..c5f4675 100644 --- a/filedir.tex +++ b/filedir.tex @@ -67,19 +67,19 @@ la directory che contiene il riferimento alla directory corrente; nel caso questa sia la directory radice allora il riferimento è a se stessa. -\section{La manipolazione dei files} +\section{L'architettura di gestione dei file} \label{sec:filedir_file_handling} Per capire fino in fondo le proprietà di files e directories in un sistema unix ed il funzionamento delle relative funzioni di manipolazione occorre una -breve introduzione agli oggetti su cui è basato un filesystem unix; in -particolare si riprenderà, approfondendolo sul piano dell'uso nelle funzioni -di libreria, il concetto di \textit{inode} di cui abbiamo brevemente accennato -le caratteristiche (dal lato dell'implementazione nel kernel) in -\secref{sec:fileintr_vfs}. +breve introduzione sulla gestione dei medesimo e sugli oggetti su cui è basato +un filesystem unix; in particolare si riprenderà, approfondendolo sul piano +dell'uso nelle funzioni di libreria, il concetto di \textit{inode} di cui +abbiamo brevemente accennato le caratteristiche (dal lato dell'implementazione +nel kernel) in \secref{sec:fileintr_vfs}. -\subsection{Il funzionamento di un filesystem} +\subsection{Il funzionamento di un filesystem unix} \label{sec:filedir_filesystem} Come già accennato in \secref{sec:fileintr_overview} linux (ed ogni unix in @@ -132,7 +132,7 @@ particolare \item Come mostrato in \curfig si possono avere più voci 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, + 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 @@ -191,30 +191,43 @@ suole chiamare questo tipo di associazione un collegamento diretto (o \textit{hard link}). Il prototipo della funzione e le sue caratteritiche principali, come risultano dalla man page, sono le seguenti: \begin{prototype}{unistd.h} -{int link(const char * oldname, const char * newname)} - Crea un nuovo collegamento diretto al file indicato da \texttt{oldname} - dandogli nome \texttt{newname}. +{int link(const char * oldpath, const char * newpath)} + Crea un nuovo collegamento diretto al file indicato da \texttt{oldpath} + dandogli nome \texttt{newpath}. 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{errlist} - \item \texttt{EXDEV} \texttt{oldname} e \texttt{newname} non sono sullo + \item \texttt{EXDEV} \texttt{oldpath} e \texttt{newpath} 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 + \item \texttt{EPERM} il filesystem che contiene \texttt{oldpath} e + \texttt{newpath} non supporta i link diretti, oppure \texttt{oldpath} è + una directory. + \item \texttt{EFAULT} una delle stringhe passate come parametri è fuori + dello spazio di indirizzi del processo. + \item \texttt{EACCESS} errore di accesso (mancano i permessi per scrivere o + per attraversare le directories), vedi \secref{sec:filedir_access_control} + per i dettagli. + \item \texttt{ENAMETOOLONG} una dei due pathname è troppo lungo. + \item \texttt{ENOENT} un componente di \texttt{oldpath} o \texttt{newpath} + non esiste o è un link simbolico spezzato. + \item \texttt{ENOTDIR} un componente di \texttt{oldpath} o \texttt{newpath} + non è una directory. + \item \texttt{ENOMEM} il kernel non ha a disposizione memoria sufficiente a + completare l'operazione. + \item \texttt{EROFS} la directory su cui si vuole inserire il nuovo link è + su un filesystem montato readonly. + \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 + \item \texttt{EMLINK} ci sono troppi link al file \texttt{oldpath} (il numero massimo è specificato dalla variabile \texttt{LINK\_MAX}, vedi - \secref{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. + \secref{sec:xxx_limits}). + \item \texttt{ELOOP} si incontrati troppi link simbolici nella risoluzione + di \texttt{oldpath} o \texttt{newpath}. + \item \texttt{ENOSPC} la directory in cui si vuole creare il link non ha + spazio per ulteriori voci. + \item \texttt{EIO} c'è stato un errore di input/output. \end{errlist} \end{prototype} @@ -231,15 +244,17 @@ 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 \secref{sec:filedir_symlink}) che molti programmi -non sono in grado di gestire e la cui rimozione diventa estremamente +dei circoli nel filesystem (vedi \secref{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). +riparare il filesystem); data la sua pericolosità in linux questa +caratteristica è stata disabilitata, e la funzione restituisce l'errore +\texttt{EPERM}. La rimozione di un file (o più precisamente della voce che lo referenzia) si effettua con la funzione \texttt{unlink}; il suo prototipo è il seguente: -\begin{prototype}{unistd.h}{int unlink(const char * filename)} +\begin{prototype}{unistd.h}{int unlink(const char * pathname)} Cancella il nome specificato dal pathname nella relativa directory e decrementa il numero di riferimenti nel relativo inode. Nel caso di link simbolico cancella il link simbolico; nel caso di socket, fifo o file di @@ -250,24 +265,25 @@ effettua con la funzione \texttt{unlink}; il suo prototipo qual caso il file non viene toccato. La variabile \texttt{errno} viene settata secondo i seguenti codici di errore: \begin{errlist} - \item \texttt{EACCESS} Non c'è il permesso di scrittura per la directory in - cui si vuole creare il nuovo link o una delle directory del pathname non - consente la ricerca (permesso di esecuzione). - \item \texttt{EPERM} il pathname indica una directory o il filesystem che - contiene \texttt{filename} non consente l'operazione. - \item \texttt{EROFS} \texttt{filename} è su un filesystem montato in sola - lettura. - \item \texttt{EFAULT} la stringa \texttt{filename} è fuori dello spazio di - indirizzi del processo. - \item \texttt{ENAMETOOLONG} il pathname è troppo lungo. - \item \texttt{ENOENT} Uno dei componenti del pathname non esiste o è un link + \item \texttt{EACCESS} errore di accesso (mancano i permessi per scrivere o + per attraversare le directories), vedi \secref{sec:filedir_access_control} + per i dettagli. + \item \texttt{EPERM} il filesystem che contiene \texttt{pathname} non + consente l'operazione. + \item \texttt{EFAULT} la stringa passata come parametro è fuori dello spazio + di indirizzi del processo. + \item \texttt{ENAMETOOLONG} il pathname troppo lungo. + \item \texttt{ENOENT} uno dei componenti del pathname non esiste o è un link simbolico spezzato. - \item \texttt{ENOTDIR} Uno dei componenti del pathname non è una directory. - \item \texttt{EISDIR} il pathname indica una directory. - \item \texttt{ENOMEM} Memoria insufficiente nel kernel. - \item \texttt{ELOOP} Ci sono troppi link simbolici nella risoluzione del + \item \texttt{ENOTDIR} uno dei componenti del pathname non è una directory. + \item \texttt{EISDIR} \texttt{pathname} fa riferimento a una directory. + \item \texttt{ENOMEM} il kernel non ha a disposizione memoria sufficiente a + completare l'operazione. + \item \texttt{EROFS} \texttt{pathname} è su un filesystem montato in sola + lettura. + \item \texttt{ELOOP} ci sono troppi link simbolici nella risoluzione del pathname. - \item \texttt{EIO} Errore di input/output. + \item \texttt{EIO} errore di input/output. \end{errlist} \end{prototype} @@ -280,10 +296,10 @@ proprietari della directory (o root, per cui nessuna delle restrizioni applicata). Una delle caratteristiche di queste funzioni è che la creazione/rimozione -della nome 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. +della nome 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. Si ricordi infine che il file non viene eliminato dal disco fintanto che tutti i riferimenti ad esso sono stati cancellati, solo quando il \textit{link @@ -301,40 +317,24 @@ Al contrario di quanto avviene con altri unix in linux non \texttt{unlink} sulle directory, per cancellare una directory si può usare la funzione \texttt{rmdir} (vedi \secref{sec:filedir_dir_creat_rem}), oppure la funzione \texttt{remove}. Questa è la funzione prevista dallo standard ANSI C -per cancellare un file (e funziona anche per i sistemi che non supportano i -link diretti), che per i file è identica alla \texttt{unlink} e per le -directory è identica alla \texttt{rmdir}: +per cancellare un file o una directory (e funziona anche per i sistemi che non +supportano i link diretti), che per i file è identica alla \texttt{unlink} e +per le directory è identica alla \texttt{rmdir}: \begin{prototype}{stdio.h}{int remove(const char *pathname)} Cancella un nome dal filesystem. Usa \texttt{unlink} per i file e \texttt{rmdir} per le directory. - + La funzione restituisce zero in caso di successo e -1 per un errore, nel - qual caso il file non viene toccato. La variabile \texttt{errno} viene - settata secondo i seguenti codici di errore: - \begin{errlist} {NDT da rivedere} - \item \texttt{EFAULT} la stringa \texttt{filename} è fuori dello spazio di - indirizzi del processo. - \item \texttt{EACCESS} Non c'è il permesso di scrittura per la directory in - cui si vuole creare il nuovo link o una delle directory del pathname non - consente la ricerca (permesso di esecuzione). - \item \texttt{EPERM} il pathname indica una directory o il filesystem che - contiene \texttt{filename} non consente l'operazione. - \item \texttt{EROFS} \texttt{filename} è su un filesystem montato in sola - lettura. - \item \texttt{ENAMETOOLONG} il pathname è troppo lungo. - \item \texttt{ENOENT} Uno dei componenti del pathname non esiste o è un link - simbolico spezzato. - \item \texttt{ENOTDIR} Uno dei componenti del pathname non è una directory. - \item \texttt{ENOMEM} Memoria insufficiente nel kernel. - \item \texttt{ELOOP} Ci sono troppi link simbolici nella risoluzione del - pathname. - \end{errlist} + qual caso il file non viene toccato. Per i codici di errori vedi quanto + riportato nella descrizione di \texttt{unlink} e \texttt{rmdir}. \end{prototype} Per cambiare nome ad un file si usa invece la funzione \texttt{rename}, il vantaggio nell'uso di questa funzione al posto della chiamata successiva di -\texttt{unlink} e \texttt{link} è che l'operazione è eseguita atomicamente. +\texttt{unlink} e \texttt{link} è che l'operazione è eseguita atomicamente, in +questo modo non c'è la possibilità che un processo che cerchi di accedere al +nuovo nome dopo che il vecchio è stato cambiato lo trovi mancante. \begin{prototype}{stdio.h} {int rename(const char *oldpath, const char *newpath)} @@ -343,7 +343,7 @@ vantaggio nell'uso di questa funzione al posto della chiamata successiva di La funzione restituisce zero in caso di successo e -1 per un errore, nel qual caso il file non viene toccato. La variabile \texttt{errno} viene settata secondo i seguenti codici di errore: - \begin{errlist} {NDT da rivedere} + \begin{errlist} \item \texttt{EFAULT} la stringa \texttt{filename} è fuori dello spazio di indirizzi del processo. \item \texttt{EACCESS} Non c'è il permesso di scrittura per la directory in @@ -408,7 +408,7 @@ dichiarate nell'header file \texttt{unistd.h}. di errore. La variabile \texttt{errno} viene settata secondo i codici di errore standard di accesso ai files (trattati in dettaglio in \secref{sec:filedir_access_control}) ai quali si aggiungono i seguenti: - \begin{errlist} {NDT da rivedere} + \begin{errlist} \item \texttt{EEXIST} Un file (o una directory) con quel nome esiste di già. \item \texttt{EROFS} La directory su cui si vuole inserire il nuovo link è @@ -425,7 +425,7 @@ un'altra funzione quando si vuole leggere il contenuto di un link simbolico, questa funzione è la: \begin{prototype}{unistd.h} -{int readlink(const char * path, char * buff, size_t size)} +{int readlink(const char * path, char * buff, size\_t size)} Legge il contnuto del link simbolico indicato da \texttt{path} nel buffer \texttt{buff} di dimensione \texttt{size}. Non chiude la stringa con un carattere nullo e la tronca a \texttt{size} nel caso il buffer sia troppo @@ -435,7 +435,7 @@ questa funzione La funzione restituisce il numero di caratteri letti dentro \texttt{buff} o -1 per un errore, in caso di errore. La variabile \texttt{errno} viene settata secondo i codici di errore: - \begin{errlist} {NDT da rivedere} + \begin{errlist} \item \texttt{EEXIST} Un file (o una directory) con quel nome esiste di già. \item \texttt{EROFS} La directory su cui si vuole inserire il nuovo link è