From 24c91128ce2eb232576d32311355d12e2a2bbf27 Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Mon, 26 Mar 2001 20:11:27 +0000 Subject: [PATCH] Aggiunto paragrafo sui link simbolici e non (da finire) --- files.tex | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 79 insertions(+), 7 deletions(-) diff --git a/files.tex b/files.tex index 7a52fcb..64482d0 100644 --- a/files.tex +++ b/files.tex @@ -442,8 +442,8 @@ corrente. I prototipi di queste funzioni sono dichiarati in \texttt{unistd.h}. stringa una volta cessato il suo utilizzo. La funzione restituisce il puntatore \texttt{buffer} se riesce, - \texttt{NULL} se fallisce, in quest'ultimo caso sono ritornate le seguenti - condizioni di errore: + \texttt{NULL} se fallisce, in quest'ultimo caso la variabile + \texttt{errno} è settata con i seguenti codici di errore: \begin{itemize} \item \texttt{EINVAL} L'argomento \texttt{size} è zero e \texttt{buffer} non @@ -517,16 +517,16 @@ programma deve includere il file \texttt{sys/stat.h}. \item \texttt{EACCESS} Non c'è il permesso di scrittura per la directory in cui si vuole inserire la nuova directory. - \item \texttt{EEXIST} Un file (o una directory) con quel nome essite di già + \item \texttt{EEXIST} Un file (o una directory) con quel nome essite di già. \item \texttt{EMLINK} La directory in cui si vuole creare la nuova directory contiene troppi file. Sotto linux questo normalmente non avviene perchè il filesystem standard consente la creazione di un numero di file maggiore di quelli che possono essere contenuti nell'hard-disk, ma potendo avere a che - fare anche con filesystem di altri sistemi questo errore può presentarsi + fare anche con filesystem di altri sistemi questo errore può presentarsi. \item \texttt{ENOSPC} Non c'è abbastanza spazio sul file system per creare la nuova directory. \item \texttt{EROFS} La directory su cui si vuole inserire la nuova - directory è su un filesystem monto readonly. + directory è su un filesystem montato readonly. \end{itemize} \end{itemize} @@ -550,9 +550,81 @@ dirent}. \subsection{I link simbolici e i link diretti} \label{sec:file_link} -Come si è già accennato nell'introduzione in un sistema unix quello che -caratterizza un file su disco è il suo \textit{inode}, è quindi +Una delle caratteristiche più usate quando si opera con i file è quella di +poter creare dei nomi fittizi (alias o collegamenti) per potersi riferire allo +stesso file accedendovi da directory diverse. Questo è possibile anche in +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. + +Come si è già accennato nell'introduzione in un sistema unix 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 links è +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}, e si +suole chiamare questa 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 (uno dei +dati contenuti nell'inode) aggiungendo il nuovo nome ai precedenti. Si noti +che uno stesso file può essere così richiamato in diverse directory. + +Siccome tutto ciò funziona facendo riferimento ad un inode, questa funzione +può essere applicata soltanto per file che risiedono sullo stesso filesystem, +(dato che solo in questo caso è garantita l'unicità dell'inode) e solo per +filesystem di tipo unix. Inoltre in linux non è consentito eseguire un link +diretto ad una directory. + +Per ovviare a queste limitazioni i sistemi unix supportano un'altra forma di +link (i cosiddetti \textit{soft link} o \textit{symbolic link}), che sono, +come avviene in altri sistemi operativi, dei file che contengono il +semplicemente il riferimento ad un altro file (o directory). In questo modo è +possibile effettuare link anche attraverso filesystem diversi e a directory, e +pure a file che non esistono ancora. + +Il sistema funziona in quanto i link simbolici sono contrassegnati come tali +al kernel (analogamente a quanto avviene per le directory) per cui la chiamata +ad una \texttt{open} o una \texttt{stat} su un link simbolico comporta la +lettura del contenuto del medesimo e l'applicazione della funzione al file +specificato da quest'ultimo. Invece altre funzioni come quelle per cancellare +o rinominare i file operano direttamente sul link simbolico. Inoltre esistono +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. + +Le funzioni per operare sui link sono le seguenti, esse sono tutte dichiarate +nell'header file \texttt{unistd.h}. +\begin{itemize} +\item \texttt{int link(const char * oldname, const char * newname)} + + Crea un nuovo link 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 + di errore. La variabile \texttt{errno} viene settata secondo i codici di + errore standard di accesso ai files (trattati in dettaglio in + \ref{sec:file_err_acc}) ai quali si aggiungono i seguenti: + + \begin{itemize} + \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:sys_limits}. + \item \texttt{ENOSPC} La directory in cui si vuole creare il link è piena e + non può essere . + \item \texttt{EROFS} La directory su cui si vuole inserire il nuovo link è + su un filesystem montato readonly. + \end{itemize} +\end{itemize} \section{L'input/output di basso livello} -- 2.30.2