Altre indicizzazioni, e inizio di readdir
[gapil.git] / filedir.tex
index 0264b90e5709d9fd5ec2ffe9806ce9d277072366..5b3b0b51fba8491109cb45ddca066d348e5fa48b 100644 (file)
@@ -642,9 +642,11 @@ Per creare una fifo (un file speciale, su cui torneremo in dettaglio in
     \errval{EEXIST}, \errval{ENAMETOOLONG}, \errval{ENOENT}, \errval{ENOSPC},
     \errval{ENOTDIR} e \errval{EROFS}.}
 \end{functions}
-\noindent come per \func{mknod} il file \param{pathname} non deve esistere
-(neanche come link simbolico); al solito i permessi specificati da
-\param{mode} vengono modificati dal valore di \var{umask}.
+
+La funzione crea la fifo \param{pathname} con i permessi \param{mode}. Come
+per \func{mknod} il file \param{pathname} non deve esistere (neanche come link
+simbolico); al solito i permessi specificati da \param{mode} vengono
+modificati dal valore di \var{umask}.
 
 
 
@@ -652,22 +654,22 @@ Per creare una fifo (un file speciale, su cui torneremo in dettaglio in
 \label{sec:file_dir_read}
 
 Benché le directory siano oggetti del filesystem come tutti gli altri non ha
-senso aprirle come fossero dei file di dati. Inoltre si 
-
- Può però essere utile poterne
-leggere il contenuto ad esempio per fare la lista dei file che esse contengono
-o ricerche sui medesimi. Solo il kernel può scrivere direttamente il contenuto
-di una directory (onde evitare inconsistenze all'interno del filesystem), i
-processi devono creare i file usando le apposite funzioni.
-
-Per accedere al contenuto delle directory si usano i cosiddetti
-\textit{directory streams} (chiamati così per l'analogia con i file stream di
-\capref{cha:files_std_interface}); la funzione \funcd{opendir} apre uno di
-questi stream, il suo prototipo è:
+senso aprirle come fossero dei file di dati; per questo solo il kernel può
+scrivere direttamente il contenuto di una directory (onde evitare
+inconsistenze all'interno del filesystem), mentre i processi devono creare i
+file usando le apposite funzioni. Può però essere utile potere leggere il
+contenuto di una directory, ad esempio per fare la lista dei file che contiene
+o per delle ricerche.
+
+Per far questo lo standard POSIX\footnote{le funzioni sono previste pure in
+  BSD e SVID.} ha introdotto i cosiddetti \textit{directory streams} (chiamati
+così per l'analogia con i file stream di \capref{cha:files_std_interface}) ed
+una serie di funzioni per la loro gestione. La prima di queste è
+\funcd{opendir}, il cui prototipo è:
 \begin{functions}
   \headdecl{sys/types.h} \headdecl{dirent.h} 
   
-  \funcdecl{DIR * opendir(const char *name)} 
+  \funcdecl{DIR * opendir(const char *dirname)} 
   
   Apre un \textit{directory stream}.
   
@@ -677,13 +679,16 @@ questi stream, il suo prototipo 
     \errval{ENOENT}, \errval{ENOMEM} e \errval{ENOTDIR}.}
 \end{functions}
 
-La funzione apre un \textit{directory stream} per la directory indicata da
-\param{name}, ritornando il puntatore allo stesso, e posizionandosi sulla
-prima voce della directory. 
+La funzione apre un \textit{directory stream} per la directory
+\param{dirname}, ritornando il puntatore alla relativa struttura \type{DIR}
+(questo è un tipo opaco\index{tipo!opaco} usato dalle librerie per gestire i
+\textit{directory stream}) da usare per le successive operazioni, infine
+posiziona lo stream sulla prima voce contenuta nella directory.
 
 Dato che le directory sono comunque dei file, in alcuni casi può essere utile
-conoscere il file descriptor sottostante un \textit{directory stream}, ad
-esempio per utilizzarlo con la funzione \func{fchdir} per cambiare la
+conoscere il \textit{file descriptor} (tratteremo dei \textit{file descriptor}
+in \capref{cha:file_unix_interface}) sottostante un \textit{directory stream},
+ad esempio per utilizzarlo con la funzione \func{fchdir} per cambiare la
 directory di lavoro (vedi \secref{sec:file_work_dir}) a quella relativa allo
 stream che si è aperto. A questo scopo si può usare la funzione \funcd{dirfd},
 il cui prototipo è:
@@ -698,19 +703,34 @@ il cui prototipo 
     caso di successo e -1 in caso di errore.}
 \end{functions}
 
-La funzione\footnote{questa funzione è una estensione di BSD introdotta con
-  BSD 4.3-Reno; è presente in Linux con le libc5 (a partire dalla versione
-  5.1.2) e con le \acr{glibc}.} restituisce il file descriptor associato al
-\textit{directory stream} \param{dir}, essa è disponibile solo definendo
-\macro{\_BSD\_SOURCE} o \macro{\_SVID\_SOURCE}.
-
+La funzione\footnote{questa funzione è una estensione di BSD non presente in
+  POSIX, introdotta con BSD 4.3-Reno; è presente in Linux con le libc5 (a
+  partire dalla versione 5.1.2) e con le \acr{glibc}.} restituisce il file
+descriptor associato al \textit{directory stream} \param{dir}, essa è
+disponibile solo definendo \macro{\_BSD\_SOURCE} o \macro{\_SVID\_SOURCE}.
 
+La lettura di una voce nella directory viene effettuata attraverso la funzione
+\funcd{readdir}; il suo prototipo è:
+\begin{functions}
+  \headdecl{sys/types.h} \headdecl{dirent.h} 
+  
+  \funcdecl{struct dirent *readdir(DIR *dir)}
+  
+  Legge una voce dal \textit{directory stream}.
+  
+  \bodydesc{La funzione restituisce il puntatore alla struttura contentente i
+    dati in caso di successo e \val{NULL} altrimenti, nel qual caso
+    \var{errno} assumerà il valore \errval{EBADF}.}
+\end{functions}
 
-La funzione \func{readdir} legge il contenuto della directory, i cui elementi
-sono le \textit{directory entry} (da distinguersi da quelle della cache di cui
-parlavamo in \secref{sec:file_vfs}) in un'opportuna struttura \struct{dirent}
-definita in \figref{fig:file_dirent_struct}.
-
+La funzione legge una voce dalla directory \textit{directory
+  entry},\footnote{anche questa viene chiamata anche se non ha nulla a che
+  fare con le omonime \textit{directory entry} di cui parlavamo in
+  \secref{sec:file_vfs}).} in un'opportuna struttura \struct{dirent}, la cui
+definizione è riportata in \figref{fig:file_dirent_struct}, che contiene i
+dati relativi al file cui la voce fa riferimento. Si tenga presente che la
+struttura viene sovrascritta tutte le volte che si ripete una lettura sullo
+stesso \textit{directory stream}.
 
 \begin{figure}[!htb]
   \footnotesize
@@ -718,10 +738,11 @@ definita in \figref{fig:file_dirent_struct}.
   \begin{minipage}[c]{15cm}
     \begin{lstlisting}[labelstep=0]{}%,frame=,indent=1cm]{}
 struct dirent {
-    ino_t d_ino;
-    unsigned short int d_reclen;
-    unsigned char d_type;
-    char d_name[256];           /* We must not include limits.h! */
+    ino_t d_ino;                  /* inode number */
+    off_t d_off;                  /* offset to the next dirent */
+    unsigned short int d_reclen;  /* length of this record */
+    unsigned char d_type;         /* type of file */
+    char d_name[256];             /* We must not include limits.h! */
 };
     \end{lstlisting}
   \end{minipage} 
@@ -733,6 +754,19 @@ struct dirent {
 
 
 
+Una volta completate le operazioni si può chiudere il \textit{directory
+  stream} con la funzione \funcd{closedir}, il cui prototipo è:
+\begin{functions}
+  \headdecl{sys/types.h} \headdecl{dirent.h} 
+  
+  \funcdecl{int closedir(DIR * dir)} 
+  
+  Chiude un \textit{directory stream}.
+  
+  \bodydesc{La funzione restituisce 0 in caso di successo e -1 altrimenti, nel
+    qual caso \var{errno} assume il valore \errval{EBADF}.}
+\end{functions}
+
 
 \subsection{La directory di lavoro}
 \label{sec:file_work_dir}