X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=filedir.tex;h=9b4025ec5606dcc71bfb89e66bd2d6addf3d4be0;hp=2a634b9fa8ddb5e874ec9a3d5c6903b1be0772af;hb=9aad56ecd71e4f36e09f001cdd30b2106beec5c4;hpb=ff2d0141751ed62ef56e5bfd226c589311b8b669 diff --git a/filedir.tex b/filedir.tex index 2a634b9..9b4025e 100644 --- a/filedir.tex +++ b/filedir.tex @@ -56,26 +56,24 @@ Come spiegato in \secref{sec:file_filesystem} l'accesso al contenuto di un file su disco avviene passando attraverso il suo inode\index{inode}, che è la struttura usata dal kernel che lo identifica univocamente all'interno di un singolo filesystem. Il nome del file che si trova nella voce di una directory -è solo un'etichetta che viene associata ad un puntatore che fa riferimento al -suddetto inode. +è solo un'etichetta, mantenuta all'interno della directory, che viene +associata ad un puntatore che fa riferimento al suddetto inode. Questo significa che, fintanto che si resta sullo stesso filesystem, la realizzazione di un link è immediata, ed uno stesso file può avere tanti nomi -diversi allo stesso tempo, dati da altrettante diverse associazioni allo -stesso inode\index{inode}. Si noti anche che nessuno di questi nomi viene ad -assumere una particolare preferenza o originalità rispetto agli altri. +diversi, dati da altrettante diverse associazioni allo stesso +inode\index{inode} di etichette diverse in directory diverse. Si noti anche +che nessuno di questi nomi viene ad assumere una particolare preferenza o +originalità rispetto agli altri, in quanto tutti fanno comunque riferimento +allo stesso inode\index{inode}. Per aggiungere ad una directory una voce che faccia riferimento ad un inode\index{inode} già esistente si utilizza la funzione \func{link}; si suole chiamare questo tipo di associazione un collegamento diretto (o \textit{hard - link}). - -Il prototipo della funzione e le sue caratteristiche principali, -come risultano dalla pagina di manuale, sono le seguenti: + link}). Il prototipo della funzione è: \begin{prototype}{unistd.h} {int link(const char *oldpath, const char *newpath)} - Crea un nuovo collegamento diretto al file indicato da \param{oldpath} - dandogli nome \param{newpath}. + Crea un nuovo collegamento diretto. \bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di errore nel qual caso \var{errno} viene impostata ai valori: @@ -95,12 +93,14 @@ come risultano dalla pagina di manuale, sono le seguenti: \errval{ENOSPC}, \errval{EIO}.} \end{prototype} -La creazione di un nuovo collegamento diretto non copia il contenuto del file, -ma si limita a creare una voce nella directory specificata con \param{newpath} -e ad aumentare di uno il numero di riferimenti al file (riportato nel campo -\var{st\_nlink} della struttura \struct{stat}, vedi \secref{sec:file_stat}) -aggiungendo il nuovo nome ai precedenti. Si noti che uno stesso file può -essere così chiamato con vari nomi in diverse directory. +La funzione crea sul pathname \param{newpath} un collegamento diretto al file +indicato da \param{oldpath}. Per quanto detto la creazione di un nuovo +collegamento diretto non copia il contenuto del file, ma si limita a creare +una voce nella directory specificata da \param{newpath} e ad aumentare di uno +il numero di riferimenti al file (riportato nel campo \var{st\_nlink} della +struttura \struct{stat}, vedi \secref{sec:file_stat}) aggiungendo il nuovo +nome ai precedenti. Si noti che uno stesso file può essere così chiamato con +vari nomi in diverse directory. Per quanto dicevamo in \secref{sec:file_filesystem} la creazione di un collegamento diretto è possibile solo se entrambi i pathname sono nello stesso @@ -125,7 +125,7 @@ disabilitata, e al tentativo di creare un link diretto ad una directory la funzione restituisce l'errore \errcode{EPERM}. La rimozione di un file (o più precisamente della voce che lo referenzia -all'interno di una directory) si effettua con la funzione \func{unlink}; il +all'interno di una directory) si effettua con la funzione \funcd{unlink}; il suo prototipo è il seguente: \begin{prototype}{unistd.h}{int unlink(const char *pathname)} @@ -152,12 +152,12 @@ suo prototipo \errcode{EPERM} in caso l'operazione non sia consentita o il processo non abbia privilegi sufficienti.} -La funzione cancella il nome specificato dal pathname nella relativa directory -e decrementa il numero di riferimenti nel relativo inode\index{inode}. Nel -caso di link simbolico cancella il link simbolico; nel caso di -socket\index{socket}, fifo o file di dispositivo\index{file!di dispositivo} -rimuove il nome, ma come per i file i processi che hanno aperto uno di questi -oggetti possono continuare ad utilizzarlo. +La funzione cancella il nome specificato da \param{pathname} nella relativa +directory e decrementa il numero di riferimenti nel relativo +inode\index{inode}. Nel caso di link simbolico cancella il link simbolico; nel +caso di socket\index{socket}, fifo o file di dispositivo\index{file!di + dispositivo} rimuove il nome, ma come per i file i processi che hanno aperto +uno di questi oggetti possono continuare ad utilizzarlo. Per cancellare una voce in una directory è necessario avere il permesso di scrittura su di essa, dato che si va a rimuovere una voce dal suo contenuto, e @@ -204,7 +204,7 @@ processo (quando tutti i file vengono chiusi). Al contrario di quanto avviene con altri Unix, in Linux non è possibile usare \func{unlink} sulle directory; per cancellare una directory si può usare la funzione \func{rmdir} (vedi \secref{sec:file_dir_creat_rem}), oppure la -funzione \func{remove}. +funzione \funcd{remove}. Questa è la funzione prevista dallo standard ANSI C per cancellare un file o una directory (e funziona anche per i sistemi che non supportano i link @@ -230,7 +230,7 @@ protocollo NFS utilizzare questa funzione pu ancora in uso. Per cambiare nome ad un file o a una directory (che devono comunque essere -nello stesso filesystem) si usa invece la funzione \func{rename},\footnote{la +nello stesso filesystem) si usa invece la funzione \funcd{rename},\footnote{la funzione è definita dallo standard ANSI C, ma si applica solo per i file, lo standard POSIX estende la funzione anche alle directory.} il cui prototipo è: @@ -324,7 +324,7 @@ al kernel (analogamente a quanto avviene per le directory) per cui per alcune funzioni di libreria (come \func{open} o \func{stat}) dare come parametro un link simbolico comporta l'applicazione della funzione al file da esso specificato. La funzione che permette di creare un nuovo link simbolico è -\func{symlink}; il suo prototipo è: +\funcd{symlink}; il suo prototipo è: \begin{prototype}{unistd.h} {int symlink(const char *oldpath, const char *newpath)} Crea un nuovo link simbolico di nome \param{newpath} il cui contenuto è @@ -403,7 +403,7 @@ Dato che, come indicato in \tabref{tab:file_symb_effect}, funzioni come la \func{open} seguono i link simbolici, occorrono funzioni apposite per accedere alle informazioni del link invece che a quelle del file a cui esso fa riferimento. Quando si vuole leggere il contenuto di un link simbolico si usa -la funzione \func{readlink}, il cui prototipo è: +la funzione \funcd{readlink}, il cui prototipo è: \begin{prototype}{unistd.h} {int readlink(const char *path, char *buff, size\_t size)} Legge il contenuto del link simbolico indicato da \param{path} nel buffer @@ -479,12 +479,18 @@ ci mostrerebbe invece l'esistenza di \file{temporaneo}. \subsection{La creazione e la cancellazione delle directory} \label{sec:file_dir_creat_rem} -Per creare e cancellare delle directory si usano le due funzioni (omonime -degli analoghi comandi di shell) \func{mkdir} e \func{rmdir}. Per poter -accedere ai tipi usati da queste funzioni si deve includere il file -\file{sys/types.h}, il prototipo della prima è: -\begin{prototype}{sys/stat.h} - {int mkdir(const char *dirname, mode\_t mode)} Crea una nuova directory. +Benché in sostanza le directory non siano altro che dei file contenenti +elenchi di nomi ed inode, non è possibile trattarle come file ordinari e +devono essere create direttamente dal kernel attraverso una opportuna system +call.\footnote{questo permette anche, attraverso l'uso del VFS, l'utilizzo di + diversi formati per la gestione dei suddetti elenchi.} La funzione usata +per creare una directory è \funcd{mkdir}, ed il suo prototipo è: +\begin{functions} + \headdecl{sys/stat.h} + \headdecl{sys/types.h} + \funcdecl{int mkdir(const char *dirname, mode\_t mode)} + + Crea una nuova directory. \bodydesc{La funzione restituisce zero in caso di successo e -1 per un errore, nel qual caso \var{errno} assumerà i valori: @@ -506,7 +512,7 @@ accedere ai tipi usati da queste funzioni si deve includere il file ed inoltre anche \errval{EPERM}, \errval{EFAULT}, \errval{ENAMETOOLONG}, \errval{ENOENT}, \errval{ENOTDIR}, \errval{ENOMEM}, \errval{ELOOP}, \errval{EROFS}.} -\end{prototype} +\end{functions} La funzione crea una nuova directory vuota, che contiene cioè solo le due voci standard \file{.} e \file{..}, con il nome indicato dall'argomento @@ -520,9 +526,8 @@ creazione dei file (si veda \secref{sec:file_umask}). La titolarit nuova directory è impostata secondo quanto riportato in \secref{sec:file_ownership}. -La seconda funzione serve ad eliminare una directory già vuota (la directory -deve cioè contenere soltanto le due voci standard \file{.} e \file{..}); il -suo prototipo è: +La funzione per la cancellazione di una directory è \funcd{rmdir}, il suo +prototipo è: \begin{prototype}{sys/stat.h}{int rmdir(const char *dirname)} Cancella una directory. @@ -545,8 +550,9 @@ suo prototipo \errval{ENOTDIR}, \errval{ENOMEM}, \errval{ELOOP}, \errval{EROFS}.} \end{prototype} -La funzione cancella la directory \param{dirname}, che deve essere vuota. Il -nome può essere indicato con il pathname assoluto o relativo. +La funzione cancella la directory \param{dirname}, che deve essere vuota (la +directory deve cioè contenere soltanto le due voci standard \file{.} e +\file{..}). Il nome può essere indicato con il pathname assoluto o relativo. La modalità con cui avviene la cancellazione è analoga a quella di \func{unlink}: fintanto che il numero di link all'inode\index{inode} della