From 70885537614fe3332312bc9e9fcd900e04f22451 Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Tue, 17 Jan 2012 15:23:55 +0000 Subject: [PATCH] Uso nuove macro prototipi e flag umount2. --- filedir.tex | 206 +++++++++++++++++++++++++++++----------------------- 1 file changed, 117 insertions(+), 89 deletions(-) diff --git a/filedir.tex b/filedir.tex index 9c2e485..ac07597 100644 --- a/filedir.tex +++ b/filedir.tex @@ -1073,17 +1073,17 @@ Una volta che non si voglia più utilizzare un certo filesystem è possibile \fdecl{umount(const char *target)} \fdesc{Smonta un filesystem.} } -{La funzione ritorna $0$ in caso - di successo e $-1$ per un errore, +{La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual caso \var{errno} assumerà uno dei valori: \begin{errlist} - \item[\errcode{EPERM}] il processo non ha i privilegi di amministratore. \item[\errcode{EBUSY}] \param{target} è la \index{directory~di~lavoro} directory di lavoro di qualche processo, o contiene dei file aperti, o un altro mount point. -\end{errlist}ed inoltre \errval{ENOTDIR}, \errval{EFAULT}, \errval{ENOMEM}, -\errval{ENAMETOOLONG}, \errval{ENOENT}, \errval{ELOOP} nel loro - significato generico.} + \item[\errcode{EINVAL}] \param{target} non è un \textit{mount point}. + \item[\errcode{EPERM}] il processo non ha i privilegi di amministratore. + \end{errlist} + ed inoltre \errval{EFAULT}, \errval{ELOOP}, \errval{ENAMETOOLONG}, + \errval{ENOENT}, \errval{ENOMEM} nel loro significato generico. } \end{funcproto} La funzione prende il nome della directory su cui il filesystem è montato e @@ -1093,35 +1093,59 @@ non il file o il dispositivo che è stato montato,\footnote{questo è vero a quanto a partire dai kernel della serie 2.4.x è possibile montare lo stesso dispositivo in più punti. Nel caso più di un filesystem sia stato montato sullo stesso \itindex{mount~point} \textit{mount point} viene smontato quello -che è stato montato per ultimo. +che è stato montato per ultimo. Si tenga presente che la funzione fallisce se +il filesystem è \textsl{occupato}, cioè quando se ci sono ancora dei file +aperti sul filesystem, se questo contiene la \index{directory~di~lavoro} +directory di lavoro corrente di un qualunque processo o il +\itindex{mount~point} \textit{mount point} di un altro filesystem. -Si tenga presente che la funzione fallisce quando il filesystem è -\textsl{occupato}, cioè quando ci sono ancora dei file aperti sul filesystem, -se questo contiene la \index{directory~di~lavoro} directory di lavoro corrente -di un qualunque processo o il \itindex{mount~point} \textit{mount point} di un -altro filesystem; in questo caso l'errore restituito è \errcode{EBUSY}. +Linux provvede inoltre una seconda funzione, \funcd{umount2}, che consente un +maggior controllo delle operazioni, come forzare lo smontaggio di un +filesystem anche quando questo risulti occupato; il suo prototipo è: -Linux provvede inoltre una seconda funzione, \funcd{umount2}, che in alcuni -casi permette di forzare lo smontaggio di un filesystem, anche quando questo -risulti occupato; il suo prototipo è: \begin{funcproto}{ \fhead{sys/mount.h} \fdecl{umount2(const char *target, int flags)} \fdesc{Smonta un filesystem.} } -{La funzione è identica a \func{umount} per valori di ritorno e codici di - errore. } +{La funzione ritorna $0$ in caso di successo e $-1$ per un errore, + nel qual caso \var{errno} assumerà uno dei valori: + \begin{errlist} + \item[\errcode{EAGAIN}] + \item[\errcode{EINVAL}] + \end{errlist} + e gli altri valori visti per \func{umount} con lo stesso signigicato. +} \end{funcproto} -Il valore di \param{flags} è una maschera binaria, e al momento l'unico valore -definito è il bit \const{MNT\_FORCE}; gli altri bit devono essere nulli. +Il valore di \param{flags} è una maschera binaria, che deve essere specificato +con un OR aritmetico dei valori illustrate in tab.~\ref{tab:umount2_flags}. Specificando \const{MNT\_FORCE} la funzione cercherà di liberare il filesystem anche se è occupato per via di una delle condizioni descritte in precedenza. A seconda del tipo di filesystem alcune (o tutte) possono essere superate, evitando l'errore di \errcode{EBUSY}. In tutti i casi prima dello smontaggio -viene eseguita una sincronizzazione dei dati. +viene eseguita una sincronizzazione dei dati. + +\begin{table}[!htb] + \centering + \footnotesize + \begin{tabular}[c]{|l|p{8cm}|} + \hline + \textbf{Costante} & \textbf{Descrizione}\\ + \hline + \hline + \const{MNT\_FORCE} & (dal kernel 2.2).\\ + \const{MNT\_DETACH} & (dal kernel 2.4.11 e dalla \acr{glibc} 2.11).\\ + \const{MNT\_EXPIRE} & (dal kernel 2.6.8 e dalla \acr{glibc} 2.11).\\ + \const{UMOUNT\_NOFOLLOW}& (dal kernel 2.6.34).\\ + \hline + \end{tabular} + \caption{Costanti che identificano i bit dell'argomento \param{flags} + della funzione \func{umount2}.} + \label{tab:umount2_flags} +\end{table} + -% TODO documentare MNT_DETACH e MNT_EXPIRE ... Altre due funzioni specifiche di Linux,\footnote{esse si trovano anche su BSD, ma con una struttura diversa.} utili per ottenere in maniera diretta @@ -1137,14 +1161,14 @@ informazioni riguardo al filesystem su cui si trova un certo file, sono {Le funzioni ritornano $0$ in caso di successo e $-1$ per un errore, nel qual caso \var{errno} assumerà uno dei valori: \begin{errlist} - \item[\errcode{ENOSYS}] il filesystem su cui si trova il file specificato non + \item[\errcode{ENOSYS}] il filesystem su cui si trova il file specificato + non supporta la funzione. \end{errlist} ed inoltre \errval{EFAULT} ed \errval{EIO} per entrambe, \errval{EBADF} per \func{fstatfs}, \errval{ENOTDIR}, \errval{ENAMETOOLONG}, \errval{ENOENT}, \errval{EACCES}, \errval{ELOOP} per \func{statfs} nel loro significato generico.} \end{funcproto} - Queste funzioni permettono di ottenere una serie di informazioni generali riguardo al filesystem su cui si trova il file specificato; queste vengono restituite all'indirizzo \param{buf} di una struttura \struct{statfs} definita @@ -1164,7 +1188,6 @@ genere è il nome del filesystem stesso. \label{fig:sys_statfs} \end{figure} - Le \acr{glibc} provvedono infine una serie di funzioni per la gestione dei due file \conffile{/etc/fstab} ed \conffile{/etc/mtab}, che convenzionalmente sono usati in quasi tutti i sistemi unix-like per mantenere rispettivamente le @@ -1185,8 +1208,6 @@ tralasceremo la trattazione, rimandando al manuale delle \acr{glibc} - - \section{La gestione di file e directory} \label{sec:file_dir} @@ -1234,12 +1255,14 @@ Per aggiungere ad una directory una voce che faccia riferimento ad un \itindex{inode} \textit{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 è il seguente: -\begin{prototype}{unistd.h} -{int link(const char *oldpath, const char *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: + +\begin{funcproto}{ +\fhead{unistd.h} +\fdecl{int link(const char *oldpath, const char *newpath)} +\fdesc{Crea un nuovo collegamento diretto (\textit{hard link}).} +} +{La funzione ritorna $0$ in caso di successo e $-1$ per un errore, + nel qual caso \var{errno} assumerà uno dei valori: \begin{errlist} \item[\errcode{EXDEV}] i file \param{oldpath} e \param{newpath} non fanno riferimento ad un filesystem montato sullo stesso \itindex{mount~point} @@ -1251,11 +1274,12 @@ diretto, o \textit{hard link}. Il prototipo della funzione è il seguente: \item[\errcode{EMLINK}] ci sono troppi link al file \param{oldpath} (il numero massimo è specificato dalla variabile \const{LINK\_MAX}, vedi sez.~\ref{sec:sys_limits}). - \end{errlist} - ed inoltre \errval{EACCES}, \errval{ENAMETOOLONG}, \errval{ENOTDIR}, - \errval{EFAULT}, \errval{ENOMEM}, \errval{EROFS}, \errval{ELOOP}, - \errval{ENOSPC}, \errval{EIO}.} -\end{prototype} + \end{errlist} ed inoltre \errval{EACCES}, \errval{ENAMETOOLONG}, + \errval{ENOTDIR}, \errval{EFAULT}, \errval{ENOMEM}, \errval{EROFS}, + \errval{ELOOP}, \errval{ENOSPC}, \errval{EIO} nel loro significato + generico.} +\end{funcproto} + La funzione crea sul \itindex{pathname} \textit{pathname} \param{newpath} un collegamento diretto al file indicato da \param{oldpath}. Per quanto detto la @@ -1329,24 +1353,24 @@ farlo direttamente.\footnote{ciò non toglie che questo comportamento fuori La rimozione di un file (o più precisamente della voce che lo referenzia 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)} - Cancella un file. - - \bodydesc{La funzione restituisce zero in caso di successo e -1 per un - errore, nel qual caso il file non viene toccato. La variabile - \var{errno} viene impostata secondo i seguenti codici di errore: +\begin{funcproto}{ +\fhead{unistd.h} +\fdecl{int unlink(const char *pathname)} +\fdesc{Cancella un file.} +} +{La funzione ritorna $0$ in caso di successo e $-1$ per un errore, + nel qual caso \var{errno} assumerà uno dei valori: \begin{errlist} - \item[\errcode{EISDIR}] \param{pathname} si riferisce ad una directory. - \footnotemark + \item[\errcode{EISDIR}] \param{pathname} si riferisce ad una + directory.\footnotemark \item[\errcode{EROFS}] \param{pathname} è su un filesystem montato in sola lettura. \item[\errcode{EISDIR}] \param{pathname} fa riferimento a una directory. - \end{errlist} - ed inoltre: \errval{EACCES}, \errval{EFAULT}, \errval{ENOENT}, + \end{errlist} ed inoltre \errval{EACCES}, \errval{EFAULT}, \errval{ENOENT}, \errval{ENOTDIR}, \errval{ENOMEM}, \errval{EROFS}, \errval{ELOOP}, - \errval{EIO}.} -\end{prototype} + \errval{EIO} nel loro significato generico.} +\end{funcproto} \footnotetext{questo è un valore specifico ritornato da Linux che non consente l'uso di \func{unlink} con le directory (vedi sez.~\ref{sec:file_remove}). @@ -1412,16 +1436,17 @@ 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 diretti). Per i file è identica a \func{unlink} e per le directory è identica a \func{rmdir}; il suo prototipo è: -\begin{prototype}{stdio.h}{int remove(const char *pathname)} - Cancella un nome dal filesystem. - - \bodydesc{La funzione restituisce zero in caso di successo e -1 per un - errore, nel qual caso il file non viene toccato. - - I codici di errore riportati in \var{errno} sono quelli della chiamata - utilizzata, pertanto si può fare riferimento a quanto illustrato nelle - descrizioni di \func{unlink} e \func{rmdir}.} -\end{prototype} + +\begin{funcproto}{ +\fhead{stdio.h} +\fdecl{int remove(const char *pathname)} +\fdesc{Cancella un nome dal filesystem.} +} +{La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual + caso \var{errno} assumerà uno dei valori relativi alla chimata utilizzata, + pertanto si può fare riferimento a quanto illustrato nelle descrizioni di + \func{unlink} e \func{rmdir}.} +\end{funcproto} La funzione utilizza la funzione \func{unlink}\footnote{questo vale usando le \acr{glibc}; nelle libc4 e nelle libc5 la funzione \func{remove} è un @@ -1436,15 +1461,15 @@ 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 è: -\begin{prototype}{stdio.h} - {int rename(const char *oldpath, const char *newpath)} - - Rinomina un file. - - \bodydesc{La funzione restituisce zero in caso di successo e -1 per un - errore, nel qual caso il file non viene toccato. La variabile - \var{errno} viene impostata secondo i seguenti codici di errore: - \begin{errlist} + +\begin{funcproto}{ +\fhead{stdio.h} +\fdecl{int rename(const char *oldpath, const char *newpath)} +\fdesc{Rinomina un file.} +} +{La funzione ritorna $0$ in caso di successo e $-1$ per un errore, + nel qual caso \var{errno} assumerà uno dei valori: + \begin{errlist} \item[\errcode{EISDIR}] \param{newpath} è una directory mentre \param{oldpath} non è una directory. \item[\errcode{EXDEV}] \param{oldpath} e \param{newpath} non sono sullo @@ -1461,11 +1486,10 @@ nello stesso filesystem) si usa invece la funzione \funcd{rename},\footnote{la \item[\errcode{ENOTDIR}] uno dei componenti dei \itindex{pathname} \textit{pathname} non è una directory o \param{oldpath} è una directory e \param{newpath} esiste e non è una directory. - \end{errlist} - ed inoltre \errval{EACCES}, \errval{EPERM}, \errval{EMLINK}, + \end{errlist} ed inoltre \errval{EACCES}, \errval{EPERM}, \errval{EMLINK}, \errval{ENOENT}, \errval{ENOMEM}, \errval{EROFS}, \errval{ELOOP} e - \errval{ENOSPC}.} -\end{prototype} + \errval{ENOSPC} nel loro significato generico.} +\end{funcproto} La funzione rinomina il file \param{oldpath} in \param{newpath}, eseguendo se necessario lo spostamento di un file fra directory diverse. Eventuali altri @@ -1531,13 +1555,15 @@ alcune funzioni di libreria (come \func{open} o \func{stat}) quando ricevono come argomento un link simbolico vengono automaticamente applicate al file da esso specificato. La funzione che permette di creare un nuovo link simbolico è \funcd{symlink}, ed 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 è - \param{oldpath}. - - \bodydesc{La funzione restituisce zero in caso di successo e -1 per un - errore, nel qual caso la variabile \var{errno} assumerà i valori: + + +\begin{funcproto}{ +\fhead{unistd.h} +\fdecl{int symlink(const char *oldpath, const char *newpath)} +\fdesc{Crea un nuovo link simbolico.} +} +{La funzione ritorna $0$ in caso di successo e $-1$ per un errore, + nel qual caso \var{errno} assumerà uno dei valori: \begin{errlist} \item[\errcode{EPERM}] il filesystem che contiene \param{newpath} non supporta i link simbolici. @@ -1546,17 +1572,19 @@ esso specificato. La funzione che permette di creare un nuovo link simbolico \item[\errcode{EEXIST}] esiste già un file \param{newpath}. \item[\errcode{EROFS}] \param{newpath} è su un filesystem montato in sola lettura. - \end{errlist} - ed inoltre \errval{EFAULT}, \errval{EACCES}, \errval{ENAMETOOLONG}, - \errval{ENOTDIR}, \errval{ENOMEM}, \errval{ELOOP}, \errval{ENOSPC} e - \errval{EIO}.} -\end{prototype} + \end{errlist} ed inoltre \errval{EFAULT}, \errval{EACCES}, + \errval{ENAMETOOLONG}, \errval{ENOTDIR}, \errval{ENOMEM}, \errval{ELOOP}, + \errval{ENOSPC} e \errval{EIO} nel loro significato generico.} +\end{funcproto} -Si tenga presente che la funzione non effettua nessun controllo sull'esistenza -di un file di nome \param{oldpath}, ma si limita ad inserire quella stringa -nel link simbolico. Pertanto un link simbolico può anche riferirsi ad un file -che non esiste: in questo caso si ha quello che viene chiamato un -\textit{dangling link}, letteralmente un \textsl{link ciondolante}. +La funzione crea un nuovo link simbolico con \itindex{pathname} +\textit{pathname} \param{newpath} che fa riferimento ad \param{oldpath}. Si +tenga presente che la funzione non effettua nessun controllo sull'esistenza di +un file di nome \param{oldpath}, ma si limita ad inserire il +\itindex{pathname} \textit{pathname} nel link simbolico. Pertanto un link +simbolico può anche riferirsi ad un file che non esiste: in questo caso si ha +quello che viene chiamato un \textit{dangling link}, letteralmente un +\textsl{link ciondolante}. Come accennato i link simbolici sono risolti automaticamente dal kernel all'invocazione delle varie system call; in tab.~\ref{tab:file_symb_effect} si -- 2.30.2