X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=filedir.tex;h=5b3b0b51fba8491109cb45ddca066d348e5fa48b;hp=0264b90e5709d9fd5ec2ffe9806ce9d277072366;hb=613d2f30d1c3ec28c569578a7b7bab23a40e8fea;hpb=da0899b61653d07d75c8df134906261f1afd2485 diff --git a/filedir.tex b/filedir.tex index 0264b90..5b3b0b5 100644 --- a/filedir.tex +++ b/filedir.tex @@ -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}