\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
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
{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
\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
-
-
\section{La gestione di file e directory}
\label{sec:file_dir}
\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}
\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
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}).
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
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
\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
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.
\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