X-Git-Url: https://gapil.gnulinux.it/gitweb/?a=blobdiff_plain;f=filedir.tex;h=ac07597e75951f2433f9dab94a48da0fc4f68c5c;hb=70885537614fe3332312bc9e9fcd900e04f22451;hp=73cc8e6d0e42695bf12683115f50988272cf4f53;hpb=4aa6c51696d2b11c572eccd37238db1691785573;p=gapil.git diff --git a/filedir.tex b/filedir.tex index 73cc8e6..ac07597 100644 --- a/filedir.tex +++ b/filedir.tex @@ -374,11 +374,11 @@ fig.~\ref{fig:file_disk_filesys}, dove si hanno tre filesystem su tre partizioni. In essa per semplicità si è fatto riferimento alla struttura del filesystem \acr{ext2}, che prevede una suddivisione dei dati in \textit{block group}. All'interno di ciascun \textit{block group} viene anzitutto -replicato il cosiddetto \textit{superblock}, (la struttura che contiene -l'indice iniziale del filesystem e che consente di accedere a tutti i dati -sottostanti) e creata una opportuna suddivisione dei dati e delle informazioni -per accedere agli stessi. Sulle caratteristiche di \acr{ext2} e derivati -torneremo in sez.~\ref{sec:file_ext2}. +replicato il cosiddetto \itindex{superblock} \textit{superblock}, (la +struttura che contiene l'indice iniziale del filesystem e che consente di +accedere a tutti i dati sottostanti) e creata una opportuna suddivisione dei +dati e delle informazioni per accedere agli stessi. Sulle caratteristiche di +\acr{ext2} e derivati torneremo in sez.~\ref{sec:file_ext2}. \itindbeg{inode} @@ -401,9 +401,10 @@ per i dati in essi contenuti. Se si va ad esaminare con maggiore dettaglio la strutturazione dell'informazione all'interno del filesystem \textsl{ext2}, tralasciando i dettagli relativi al funzionamento del filesystem stesso come la -strutturazione in gruppi dei blocchi, il \textit{superblock} e tutti i dati di -gestione possiamo esemplificare la situazione con uno schema come quello -esposto in fig.~\ref{fig:file_filesys_detail}. +strutturazione in gruppi dei blocchi, il \itindex{superblock} +\textit{superblock} e tutti i dati di gestione possiamo esemplificare la +situazione con uno schema come quello esposto in +fig.~\ref{fig:file_filesys_detail}. \begin{figure}[!htb] \centering @@ -566,11 +567,12 @@ riportata in fig.~\ref{fig:file_filesys_detail}, in cui la partizione è divisa in gruppi di blocchi. Ciascun gruppo di blocchi contiene una copia delle informazioni essenziali del -filesystem (i \textit{superblock} sono quindi ridondati) per una maggiore -affidabilità e possibilità di recupero in caso di corruzione del -\textit{superblock} principale. L'utilizzo di raggruppamenti di blocchi ha -inoltre degli effetti positivi nelle prestazioni dato che viene ridotta la -distanza fra i dati e la tabella degli \itindex{inode} inode. +filesystem (i \itindex{superblock} \textit{superblock} sono quindi ridondati) +per una maggiore affidabilità e possibilità di recupero in caso di corruzione +del \itindex{superblock} \textit{superblock} principale. L'utilizzo di +raggruppamenti di blocchi ha inoltre degli effetti positivi nelle prestazioni +dato che viene ridotta la distanza fra i dati e la tabella degli +\itindex{inode} inode. \begin{figure}[!htb] \centering @@ -642,11 +644,11 @@ il cui prototipo è:\footnote{la funzione è una versione specifica di Linux che o non può essere montato su \param{target} perché la directory è ancora in uso. \item[\errcode{EINVAL}] il dispositivo \param{source} presenta un - \textit{superblock} non valido, o si è cercato di rimontare un filesystem - non ancora montato, o di montarlo senza che \param{target} sia un - \itindex{mount~point} \textit{mount point} o di spostarlo - quando \param{target} non è un \itindex{mount~point} \textit{mount point} - o è la radice. + \itindex{superblock} \textit{superblock} non valido, o si è cercato di + rimontare un filesystem non ancora montato, o di montarlo senza + che \param{target} sia un \itindex{mount~point} \textit{mount point} o di + spostarlo quando \param{target} non è un \itindex{mount~point} + \textit{mount point} o è la radice. \item[\errcode{ELOOP}] si è cercato di spostare un \itindex{mount~point} \textit{mount point} su una sottodirectory di \param{source} o si sono incontrati troppi link simolici nella risoluzione di un nome. @@ -898,22 +900,22 @@ identificati dalle costanti riportate nell'elenco seguente: dell'amministratore o di un altro utente, che gli consentirebbe di eseguirlo per conto di quest'ultimo. -\item[\const{MS\_PRIVATE}] Marca un \textit{mount point} come privato. Si - tratta di una delle nuove opzioni (insieme a \const{MS\_SHARED}, - \const{MS\_SLAVE} e \const{MS\_UNBINDABLE}) facenti parte - dell'infrastruttura degli \itindex{shared~subtree} \textit{shared subtree} - introdotta a partire dal kernel 2.6.15, che estendono le funzionalità dei - \itindex{bind~mount} \textit{bind mount}. In questo caso +\item[\const{MS\_PRIVATE}] Marca un \itindex{mount~point} \textit{mount point} + come privato. Si tratta di una delle nuove opzioni (insieme a + \const{MS\_SHARED}, \const{MS\_SLAVE} e \const{MS\_UNBINDABLE}) facenti + parte dell'infrastruttura degli \itindex{shared~subtree} \textit{shared + subtree} introdotta a partire dal kernel 2.6.15, che estendono le + funzionalità dei \itindex{bind~mount} \textit{bind mount}. In questo caso \param{target} dovrà fare riferimento al \textit{mount point} che si intende marcare, e tutti gli altri argomenti verranno ignorati. Di default, finché non lo si marca altrimenti con una delle altre opzioni dell'interfaccia \itindex{shared~subtree} \textit{shared subtree}, ogni \textit{mount point} è privato. Ogni \textit{bind mount} ottenuto da un - \textit{mount point} di tipo \textit{private} si comporta come descritto - nella trattazione di \const{MS\_BIND}. Si usa questo flag principalmente per - revocare gli effetti delle altre opzioni e riportare il comportamento a - quello ordinario. + \itindex{mount~point} \textit{mount point} di tipo \textit{private} si + comporta come descritto nella trattazione di \const{MS\_BIND}. Si usa questo + flag principalmente per revocare gli effetti delle altre opzioni e riportare + il comportamento a quello ordinario. \item[\const{MS\_RDONLY}] Esegue il montaggio del filesystem in sola lettura, non sarà possibile nessuna modifica ai suoi contenuti. Viene usato tutte le @@ -922,13 +924,13 @@ identificati dalle costanti riportate nell'elenco seguente: corrotto). All'avvio di default il kernel monta la radice in questa modalità. -\item[\const{MS\_REC}] Applica ricorsivamente a tutti i \textit{mount point} - presenti al di sotto del \textit{mount point} indicato gli effetti della - opzione degli \itindex{shared~subtree} \textit{shared subtree} - associata. Anche questo caso l'argomento \param{target} deve fare - riferimento ad un \textit{mount point} e tutti gli altri argomenti sono - ignorati, ed il flag deve essere indicato assieme ad una fra - \const{MS\_PRIVATE}, \const{MS\_SHARED}, \const{MS\_SLAVE} e +\item[\const{MS\_REC}] Applica ricorsivamente a tutti i \itindex{mount~point} + \textit{mount point} presenti al di sotto del \textit{mount point} indicato + gli effetti della opzione degli \itindex{shared~subtree} \textit{shared + subtree} associata. Anche questo caso l'argomento \param{target} deve fare + riferimento ad un \itindex{mount~point} \textit{mount point} e tutti gli + altri argomenti sono ignorati, ed il flag deve essere indicato assieme ad + una fra \const{MS\_PRIVATE}, \const{MS\_SHARED}, \const{MS\_SLAVE} e \const{MS\_UNBINDABLE}. \item[\const{MS\_RELATIME}] Indica di effettuare l'aggiornamento degli @@ -967,14 +969,15 @@ identificati dalle costanti riportate nell'elenco seguente: \const{MS\_NOATIME} e \const{MS\_NODIRATIME}, ed infine prima del kernel 2.4.10 anche \const{MS\_NODEV}, \const{MS\_NOEXEC} e \const{MS\_NOSUID}. -\item[\const{MS\_SHARED}] Marca un \textit{mount point} come \textit{shared - mount}. Si tratta di una delle nuove opzioni (insieme a +\item[\const{MS\_SHARED}] Marca un \itindex{mount~point} \textit{mount point} + come \textit{shared mount}. Si tratta di una delle nuove opzioni (insieme a \const{MS\_PRIVATE}, \const{MS\_SLAVE} e \const{MS\_UNBINDABLE}) facenti parte dell'infrastruttura degli \itindex{shared~subtree} \textit{shared subtree} introdotta a partire dal kernel 2.6.15, che estendono le funzionalità dei \itindex{bind~mount} \textit{bind mount}. In questo caso - \param{target} dovrà fare riferimento al \textit{mount point} che si intende - marcare, e tutti gli altri argomenti verranno ignorati. + \param{target} dovrà fare riferimento al \itindex{mount~point} \textit{mount + point} che si intende marcare, e tutti gli altri argomenti verranno + ignorati. Lo scopo dell'opzione è ottenere che tutti i successivi \textit{bind mount} effettuati da un \textit{mount point} marcato da essa siano di tipo @@ -991,8 +994,8 @@ identificati dalle costanti riportate nell'elenco seguente: non fuorviante, la precedente \const{MS\_VERBOSE}, introdotta nel kernel 2.6.12, che aveva lo stesso effetto. -\item[\const{MS\_SLAVE}] Marca un \textit{mount point} come \textit{slave - mount}. Si tratta di una delle nuove opzioni (insieme a +\item[\const{MS\_SLAVE}] Marca un \itindex{mount~point} \textit{mount point} + come \textit{slave mount}. Si tratta di una delle nuove opzioni (insieme a \const{MS\_PRIVATE}, \const{MS\_SHARED} e \const{MS\_UNBINDABLE}) facenti parte dell'infrastruttura degli \itindex{shared~subtree} \textit{shared subtree} introdotta a partire dal kernel 2.6.15, che estendono le @@ -1008,7 +1011,8 @@ identificati dalle costanti riportate nell'elenco seguente: questo caso vengono ``\textsl{propagate}'' soltanto dal \textit{mount point} originale (detto anche \textit{master}) verso gli \textit{slave}, mentre essi potranno eseguire al loro interno ulteriori montaggi che non saranno - propagati né negli altri né nel \textit{mount point} originale. + propagati né negli altri né nel \itindex{mount~point} \textit{mount point} + originale. \item[\const{MS\_STRICTATIME}] Ripristina il comportamento tradizionale per cui l'\textit{access time} viene aggiornato ad ogni accesso al @@ -1028,25 +1032,26 @@ identificati dalle costanti riportate nell'elenco seguente: compromesso in cui questo comportamento avviene solo per le directory, ed ha quindi una incidenza nettamente minore, si può usare \const{MS\_DIRSYNC}. -\item[\const{MS\_UNBINDABLE}] Marca un \textit{mount point} come - \textit{unbindable mount}. Si tratta di una delle nuove opzioni (insieme a - \const{MS\_PRIVATE}, \const{MS\_SHARED} e \const{MS\_SLAVE}) facenti parte - dell'infrastruttura degli \itindex{shared~subtree} \textit{shared subtree} - introdotta a partire dal kernel 2.6.15, che estendono le funzionalità dei - \itindex{bind~mount} \textit{bind mount}. In questo caso +\item[\const{MS\_UNBINDABLE}] Marca un \itindex{mount~point} \textit{mount + point} come \textit{unbindable mount}. Si tratta di una delle nuove + opzioni (insieme a \const{MS\_PRIVATE}, \const{MS\_SHARED} e + \const{MS\_SLAVE}) facenti parte dell'infrastruttura degli + \itindex{shared~subtree} \textit{shared subtree} introdotta a partire dal + kernel 2.6.15, che estendono le funzionalità dei \itindex{bind~mount} + \textit{bind mount}. In questo caso \param{target} dovrà fare riferimento al \textit{mount point} che si intende marcare, e tutti gli altri argomenti verranno ignorati. Un \textit{mount point} marcato in questo modo disabilità la capacità di eseguire dei \itindex{bind~mount} \textit{bind mount}. Si comporta cioè come - allo stesso modo di un \textit{mount point} ordinario di tipo - \textit{private} con in più la restrizione che nessuna sua sottodirectory - (anche se relativa ad un ulteriore montaggio) possa essere utilizzata per un - come sorgente di un \itindex{bind~mount} \textit{bind mount}. + allo stesso modo di un \itindex{mount~point} \textit{mount point} ordinario + di tipo \textit{private} con in più la restrizione che nessuna sua + sottodirectory (anche se relativa ad un ulteriore montaggio) possa essere + utilizzata per un come sorgente di un \itindex{bind~mount} \textit{bind + mount}. \end{basedescript} - % NOTE per \const{MS\_SLAVE},\const{MS\_SHARE}, \const{MS\_PRIVATE} e % \const{MS\_UNBINDABLE} dal 2.6.15 vedi shared subtrees, in particolare % * http://lwn.net/Articles/159077/ e @@ -1059,14 +1064,6 @@ identificati dalle costanti riportate nell'elenco seguente: % * MS_ACTIVE % * MS_NOUSER -La funzione \func{mount} può essere utilizzata anche per effettuare il -\textsl{rimontaggio} di un filesystem, cosa che permette di cambiarne al volo -alcune delle caratteristiche di funzionamento (ad esempio passare da sola -lettura a lettura/scrittura). Questa operazione è attivata attraverso uno dei -bit di \param{mountflags}, \const{MS\_REMOUNT}, che se impostato specifica che -deve essere effettuato il rimontaggio del filesystem (con le opzioni -specificate dagli altri bit), anche in questo caso il valore di \param{source} -viene ignorato. Una volta che non si voglia più utilizzare un certo filesystem è possibile \textsl{smontarlo} usando la funzione \funcd{umount}, il cui prototipo è: @@ -1076,54 +1073,79 @@ 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{EBUSY}] \param{target} è la \index{directory~di~lavoro} + directory di lavoro di qualche processo, o contiene dei file aperti, o un + altro mount point. + \item[\errcode{EINVAL}] \param{target} non è un \textit{mount point}. \item[\errcode{EPERM}] il processo non ha i privilegi di amministratore. - \item[\errcode{EBUSY}] \param{target} è la 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.} + \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 non il file o il dispositivo che è stato montato,\footnote{questo è vero a partire dal kernel 2.3.99-pre7, prima esistevano due chiamate separate e la funzione poteva essere usata anche specificando il file di dispositivo.} in -quanto con il kernel 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. - -Si tenga presente che la funzione fallisce quando il filesystem è -\textsl{occupato}, questo avviene quando ci sono ancora file aperti sul -filesystem, se questo contiene la 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 in alcuni -casi permette di forzare lo smontaggio di un filesystem, anche quando questo -risulti occupato; il suo prototipo è: +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. 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. + +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 è: + \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 @@ -1139,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 @@ -1166,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 @@ -1187,8 +1208,6 @@ tralasceremo la trattazione, rimandando al manuale delle \acr{glibc} - - \section{La gestione di file e directory} \label{sec:file_dir} @@ -1236,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} @@ -1253,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 @@ -1331,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}). @@ -1414,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 @@ -1438,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 @@ -1454,19 +1477,19 @@ nello stesso filesystem) si usa invece la funzione \funcd{rename},\footnote{la \item[\errcode{ENOTEMPTY}] \param{newpath} è una directory già esistente e non vuota. \item[\errcode{EBUSY}] o \param{oldpath} o \param{newpath} sono in uso da - parte di qualche processo (come directory di lavoro o come radice) o del - sistema (come \itindex{mount~point} \textit{mount point}). + parte di qualche processo (come \index{directory~di~lavoro} directory di + lavoro o come radice) o del sistema (come \itindex{mount~point} + \textit{mount point}). \item[\errcode{EINVAL}] \param{newpath} contiene un prefisso di \param{oldpath} o più in generale si è cercato di creare una directory come sotto-directory di se stessa. \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 @@ -1532,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. @@ -1547,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 @@ -1756,8 +1783,9 @@ La funzione che permette la cancellazione di una directory è invece che contiene la directory che si vuole cancellare, o non c'è il permesso di attraversare (esecuzione) una delle directory specificate in \param{dirname}. - \item[\errcode{EBUSY}] la directory specificata è la directory di lavoro o la - radice di qualche processo. + \item[\errcode{EBUSY}] la directory specificata è la + \index{directory~di~lavoro} directory di lavoro o la radice di qualche + processo. \item[\errcode{ENOTEMPTY}] la directory non è vuota. \end{errlist} ed inoltre anche \errval{EFAULT}, \errval{ENAMETOOLONG}, \errval{ENOENT}, @@ -1892,8 +1920,8 @@ comportato il passaggio di \type{dev\_t} a \index{tipo!opaco} tipo opaco, e la necessità di specificare il numero tramite delle opportune macro, così da non avere problemi di compatibilità con eventuali ulteriori estensioni. -Le macro sono definite nel file \file{sys/sysmacros.h}, che viene -automaticamente incluso quando si include \file{sys/types.h}; si possono +Le macro sono definite nel file \headfile{sys/sysmacros.h}, che viene +automaticamente incluso quando si include \headfile{sys/types.h}; si possono pertanto ottenere i valori del \itindex{major~number} \textit{major number} e \itindex{minor~number} \textit{minor number} di un dispositivo rispettivamente con le macro \macro{major} e \macro{minor}: @@ -2021,7 +2049,7 @@ La funzione restituisce il file descriptor associato al \textit{directory stream} \param{dir}. Di solito si utilizza questa funzione in abbinamento a funzioni che operano sui file descriptor, ad esempio si potrà usare \func{fstat} per ottenere le proprietà della directory, o \func{fchdir} per -spostare su di essa la directory di lavoro (vedi +spostare su di essa la \index{directory~di~lavoro} directory di lavoro (vedi sez.~\ref{sec:file_work_dir}). Viceversa se si è aperto un file descriptor corrispondente ad una directory è @@ -2378,17 +2406,18 @@ una directory. La funzione inizia con l'aprire (\texttt{\small 18--22}) uno stream sulla directory passata come primo argomento, stampando un messaggio in caso di errore. -Il passo successivo (\texttt{\small 23--24}) è cambiare directory di lavoro -(vedi sez.~\ref{sec:file_work_dir}), usando in sequenza le funzioni -\func{dirfd} e \func{fchdir} (in realtà si sarebbe potuto usare direttamente -\func{chdir} su \var{dirname}), in modo che durante il successivo ciclo -(\texttt{\small 26--30}) sulle singole voci dello stream ci si trovi -all'interno della directory.\footnote{questo è essenziale al funzionamento - della funzione \code{do\_ls}, e ad ogni funzione che debba usare il campo - \var{d\_name}, in quanto i nomi dei file memorizzati all'interno di una - struttura \struct{dirent} sono sempre relativi alla directory in questione, - e senza questo posizionamento non si sarebbe potuto usare \func{stat} per - ottenere le dimensioni.} +Il passo successivo (\texttt{\small 23--24}) è cambiare +\index{directory~di~lavoro} directory di lavoro (vedi +sez.~\ref{sec:file_work_dir}), usando in sequenza le funzioni \func{dirfd} e +\func{fchdir} (in realtà si sarebbe potuto usare direttamente \func{chdir} su +\var{dirname}), in modo che durante il successivo ciclo (\texttt{\small + 26--30}) sulle singole voci dello stream ci si trovi all'interno della +directory.\footnote{questo è essenziale al funzionamento della funzione + \code{do\_ls}, e ad ogni funzione che debba usare il campo \var{d\_name}, in + quanto i nomi dei file memorizzati all'interno di una struttura + \struct{dirent} sono sempre relativi alla directory in questione, e senza + questo posizionamento non si sarebbe potuto usare \func{stat} per ottenere + le dimensioni.} Avendo usato lo stratagemma di fare eseguire tutte le manipolazioni necessarie alla funzione passata come secondo argomento, il ciclo di scansione della @@ -2412,7 +2441,7 @@ chiusura (\texttt{\small 32}) dello stream\footnote{nel nostro caso, uscendo \label{sec:file_work_dir} \itindbeg{pathname} - +\index{directory~di~lavoro|(} Come accennato in sez.~\ref{sec:proc_fork} a ciascun processo è associata una directory nel filesystem,\footnote{questa viene mantenuta all'interno dei dati della sua \struct{task\_struct} (vedi fig.~\ref{fig:proc_task_struct}), più @@ -2490,11 +2519,11 @@ la directory corrente (vale a dire ``\texttt{.}'') e tornarvi in seguito con Una seconda usata per ottenere la directory di lavoro è \code{char *get\_current\_dir\_name(void)} che è sostanzialmente equivalente ad una \code{getcwd(NULL, 0)}, con la sola differenza che essa ritorna il valore -della variabile di ambiente \val{PWD}, che essendo costruita dalla shell può -contenere un \textit{pathname} comprendente anche dei link simbolici. Usando -\func{getcwd} infatti, essendo il \textit{pathname} ricavato risalendo -all'indietro l'albero della directory, si perderebbe traccia di ogni passaggio -attraverso eventuali link simbolici. +della variabile di ambiente \envvar{PWD}, che essendo costruita dalla shell +può contenere un \textit{pathname} comprendente anche dei link +simbolici. Usando \func{getcwd} infatti, essendo il \textit{pathname} ricavato +risalendo all'indietro l'albero della directory, si perderebbe traccia di ogni +passaggio attraverso eventuali link simbolici. Per cambiare la directory di lavoro si può usare la funzione \funcd{chdir} (equivalente del comando di shell \cmd{cd}) il cui nome sta appunto per @@ -2533,7 +2562,7 @@ quello in cui il processo non ha il permesso di accesso alla directory specificata da \param{fd}. \itindend{pathname} - +\index{directory~di~lavoro|)} \subsection{I file temporanei} @@ -2570,7 +2599,7 @@ massimo di \const{TMP\_MAX} volte, limite oltre il quale il comportamento è indefinito. Al nome viene automaticamente aggiunto come prefisso la directory specificata dalla costante \const{P\_tmpdir}.\footnote{le costanti \const{L\_tmpnam}, \const{P\_tmpdir} e \const{TMP\_MAX} sono definite in - \file{stdio.h}.} + \headfile{stdio.h}.} Di questa funzione esiste una versione \index{funzioni!rientranti} rientrante, \func{tmpnam\_r}, che non fa nulla quando si passa \val{NULL} come argomento. @@ -2591,7 +2620,7 @@ L'argomento \param{pfx} specifica un prefisso di massimo 5 caratteri per il nome provvisorio. La funzione assegna come directory per il file temporaneo, verificando che esista e sia accessibile, la prima valida fra le seguenti: \begin{itemize*} -\item La variabile di ambiente \const{TMPDIR} (non ha effetto se non è +\item La variabile di ambiente \envvar{TMPDIR} (non ha effetto se non è definita o se il programma chiamante è \itindex{suid~bit} \acr{suid} o \itindex{sgid~bit} \acr{sgid}, vedi sez.~\ref{sec:file_special_perm}). \item il valore dell'argomento \param{dir} (se diverso da \val{NULL}). @@ -2689,7 +2718,7 @@ sez.~\ref{sec:file_perm_overview}) sono impostati al valore \code{0600} questa funzione esiste una variante \funcd{mkostemp}, introdotta specificamente dalla \acr{glibc},\footnote{la funzione è stata introdotta nella versione 2.7 delle librerie e richiede che sia definita la macro - \const{\_GNU\_SOURCE}.} il cui prototipo è: + \macro{\_GNU\_SOURCE}.} il cui prototipo è: \begin{prototype}{stlib.h}{int mkostemp(char *template, int flags)} Genera un file temporaneo. @@ -2772,7 +2801,7 @@ riferimento. Infine \func{fstat} esegue la stessa operazione su un file già aperto, specificato tramite il suo file descriptor \param{filedes}. La struttura \struct{stat} usata da queste funzioni è definita nell'header -\file{sys/stat.h} e in generale dipende dall'implementazione; la versione +\headfile{sys/stat.h} e in generale dipende dall'implementazione; la versione usata da Linux è mostrata in fig.~\ref{fig:file_stat_struct}, così come riportata dalla pagina di manuale di \func{stat}; in realtà la definizione effettivamente usata nel kernel dipende dall'architettura e ha altri campi @@ -2793,7 +2822,7 @@ sez.~\ref{sec:file_file_times}), o per il padding dei campi. Si noti come i vari membri della struttura siano specificati come tipi primitivi del sistema (di quelli definiti in -tab.~\ref{tab:intro_primitive_types}, e dichiarati in \file{sys/types.h}). +tab.~\ref{tab:intro_primitive_types}, e dichiarati in \headfile{sys/types.h}). \subsection{I tipi di file} \label{sec:file_types} @@ -2827,14 +2856,14 @@ riportato in tab.~\ref{tab:file_type_macro}. \macro{S\_ISSOCK}\texttt{(m)} & socket.\\ \hline \end{tabular} - \caption{Macro per i tipi di file (definite in \texttt{sys/stat.h}).} + \caption{Macro per i tipi di file (definite in \headfile{sys/stat.h}).} \label{tab:file_type_macro} \end{table} Oltre alle macro di tab.~\ref{tab:file_type_macro} è possibile usare direttamente il valore di \var{st\_mode} per ricavare il tipo di file controllando direttamente i vari bit in esso memorizzati. Per questo sempre in -\file{sys/stat.h} sono definite le costanti numeriche riportate in +\headfile{sys/stat.h} sono definite le costanti numeriche riportate in tab.~\ref{tab:file_mode_flags}. Il primo valore dell'elenco di tab.~\ref{tab:file_mode_flags} è la maschera @@ -2881,7 +2910,7 @@ un'opportuna combinazione. \hline \end{tabular} \caption{Costanti per l'identificazione dei vari bit che compongono il campo - \var{st\_mode} (definite in \file{sys/stat.h}).} + \var{st\_mode} (definite in \headfile{sys/stat.h}).} \label{tab:file_mode_flags} \end{table} @@ -6129,13 +6158,14 @@ Un elenco delle delle \textit{capabilities} disponibili su Linux, con una breve descrizione ed il nome delle costanti che le identificano, è riportato in tab.~\ref{tab:proc_capabilities};\footnote{l'elenco presentato questa tabella, ripreso dalla pagina di manuale (accessibile con \texttt{man - capabilities}) e dalle definizioni in \texttt{linux/capabilities.h}, è - aggiornato al kernel 2.6.26.} la tabella è divisa in due parti, la prima -riporta le \textit{capabilities} previste anche nella bozza dello standard -POSIX1.e, la seconda quelle specifiche di Linux. Come si può notare dalla -tabella alcune \textit{capabilities} attengono a singole funzionalità e sono -molto specializzate, mentre altre hanno un campo di applicazione molto vasto, -che è opportuno dettagliare maggiormente. + capabilities}) e dalle definizioni in + \texttt{include/linux/capabilities.h}, è aggiornato al kernel 2.6.26.} la +tabella è divisa in due parti, la prima riporta le \textit{capabilities} +previste anche nella bozza dello standard POSIX1.e, la seconda quelle +specifiche di Linux. Come si può notare dalla tabella alcune +\textit{capabilities} attengono a singole funzionalità e sono molto +specializzate, mentre altre hanno un campo di applicazione molto vasto, che è +opportuno dettagliare maggiormente. \begin{table}[!h!btp] \centering @@ -6403,8 +6433,9 @@ fig.~\ref{fig:cap_kernel_struct}. Per un certo periodo di tempo era anche indicato che per poterle utilizzare fosse necessario che la macro \macro{\_POSIX\_SOURCE} risultasse non definita (ed era richiesto di inserire una istruzione \texttt{\#undef \_POSIX\_SOURCE} prima di includere -\texttt{sys/capability.h}) requisito che non risulta più presente.\footnote{e - non è chiaro neanche quanto sia mai stato davvero necessario.} +\headfile{sys/capability.h}) requisito che non risulta più +presente.\footnote{e non è chiaro neanche quanto sia mai stato davvero + necessario.} Si tenga presente che le strutture di fig.~\ref{fig:cap_kernel_struct}, come i prototipi delle due funzioni \func{capget} e \func{capset}, sono soggette ad @@ -6599,8 +6630,8 @@ La funzione richiede che si indichi quale degli insiemi si intente cancellare con l'argomento \param{flag}. Questo deve essere specificato con una variabile di tipo \type{cap\_flag\_t} che può assumere esclusivamente\footnote{si tratta in effetti di un tipo enumerato, come si può verificare dalla sua - definizione che si trova in \texttt{/usr/include/sys/capability.h}.} uno dei -valori illustrati in tab.~\ref{tab:cap_set_identifier}. + definizione che si trova in \headfile{sys/capability.h}.} uno dei valori +illustrati in tab.~\ref{tab:cap_set_identifier}. Si possono inoltre confrontare in maniera diretta due diversi \textit{capability state} con la funzione \funcd{cap\_compare}; il suo @@ -6664,7 +6695,7 @@ prendere come valore uno qualunque di quelli riportati in tab.~\ref{tab:proc_capabilities}, in questo caso però non è possibile combinare diversi valori in una maschera binaria, una variabile di tipo \type{cap\_value\_t} può indicare una sola capacità.\footnote{in - \texttt{sys/capability.h} il tipo \type{cap\_value\_t} è definito come + \headfile{sys/capability.h} il tipo \type{cap\_value\_t} è definito come \ctyp{int}, ma i valori validi sono soltanto quelli di tab.~\ref{tab:proc_capabilities}.} @@ -6857,7 +6888,7 @@ specifico occorre usare la funzione \funcd{capgetp}, il cui prototipo\footnote{su alcune pagine di manuale la funzione è descritta con un prototipo sbagliato, che prevede un valore di ritorno di tipo \type{cap\_t}, ma il valore di ritorno è intero, come si può verificare anche dalla - dichiarazione della stessa in \texttt{sys/capability.h}.} è: + dichiarazione della stessa in \headfile{sys/capability.h}.} è: \begin{functions} \headdecl{sys/capability.h} @@ -6974,19 +7005,20 @@ questa sezione. % TODO riferimenti ai bind mount, link simbolici ecc. Come accennato in sez.~\ref{sec:proc_fork} ogni processo oltre ad una -directory di lavoro, ha anche una directory \textsl{radice}\footnote{entrambe - sono contenute in due campi (rispettivamente \var{pwd} e \var{root}) di - \struct{fs\_struct}; vedi fig.~\ref{fig:proc_task_struct}.} che, pur essendo -di norma corrispondente alla radice dell'albero di file e directory come visto -dal kernel (ed illustrato in sez.~\ref{sec:file_pathname}), ha per il processo -il significato specifico di directory rispetto alla quale vengono risolti i +\index{directory~di~lavoro} directory di lavoro, ha anche una directory +\textsl{radice}\footnote{entrambe sono contenute in due campi (rispettivamente + \var{pwd} e \var{root}) di \struct{fs\_struct}; vedi + fig.~\ref{fig:proc_task_struct}.} che, pur essendo di norma corrispondente +alla radice dell'albero di file e directory come visto dal kernel (ed +illustrato in sez.~\ref{sec:file_pathname}), ha per il processo il significato +specifico di directory rispetto alla quale vengono risolti i \itindsub{pathname}{assoluto}\textit{pathname} assoluti.\footnote{cioè quando un processo chiede la risoluzione di un \textit{pathname}, il kernel usa sempre questa directory come punto di partenza.} Il fatto che questo valore sia specificato per ogni processo apre allora la possibilità di modificare le modalità di risoluzione dei \textit{pathname} assoluti da parte di un processo cambiando questa directory, così come si fa coi -\itindsub{pathname}{relativo}\textit{pathname} relativi cambiando la directory +\itindsub{pathname}{relativo}\textit{pathname} relativi cambiando la \index{directory~di~lavoro} directory di lavoro. Normalmente la directory radice di un processo coincide anche con la radice @@ -7028,19 +7060,20 @@ cambia la directory di lavoro, che potrebbe restare fuori dalla \textit{chroot Questo è il motivo per cui la funzione è efficace solo se dopo averla eseguita si cedono i privilegi di root. Infatti se per un qualche motivo il processo -resta con la directory di lavoro fuori dalla \textit{chroot jail}, potrà -comunque accedere a tutto il resto del filesystem usando -\itindsub{pathname}{relativo}\textit{pathname} relativi, i quali, partendo -dalla directory di lavoro che è fuori della \textit{chroot jail}, potranno -(con l'uso di ``\texttt{..}'') risalire fino alla radice effettiva del -filesystem. +resta con \index{directory~di~lavoro} la directory di lavoro fuori dalla +\textit{chroot jail}, potrà comunque accedere a tutto il resto del filesystem +usando \itindsub{pathname}{relativo}\textit{pathname} relativi, i quali, +partendo dalla directory di lavoro che è fuori della \textit{chroot jail}, +potranno (con l'uso di ``\texttt{..}'') risalire fino alla radice effettiva +del filesystem. Ma se ad un processo restano i privilegi di amministratore esso potrà comunque -portare la sua directory di lavoro fuori dalla \textit{chroot jail} in cui si -trova. Basta infatti creare una nuova \textit{chroot jail} con l'uso di -\func{chroot} su una qualunque directory contenuta nell'attuale directory di -lavoro. Per questo motivo l'uso di questa funzione non ha molto senso quando -un processo necessita dei privilegi di root per le sue normali operazioni. +portare la sua \index{directory~di~lavoro} directory di lavoro fuori dalla +\textit{chroot jail} in cui si trova. Basta infatti creare una nuova +\textit{chroot jail} con l'uso di \func{chroot} su una qualunque directory +contenuta nell'attuale directory di lavoro. Per questo motivo l'uso di questa +funzione non ha molto senso quando un processo necessita dei privilegi di root +per le sue normali operazioni. Un caso tipico di uso di \func{chroot} è quello di un server FTP anonimo, in questo caso infatti si vuole che il server veda solo i file che deve