Roba (pallosa) sulle directory
authorSimone Piccardi <piccardi@gnulinux.it>
Tue, 20 Mar 2001 19:40:20 +0000 (19:40 +0000)
committerSimone Piccardi <piccardi@gnulinux.it>
Tue, 20 Mar 2001 19:40:20 +0000 (19:40 +0000)
files.tex

index 4f5e304ab8b16e2a7540cbc26ee72f3b6cf74572..c0b2ee107636a4a44dc06cf6671802b7b2054660 100644 (file)
--- a/files.tex
+++ b/files.tex
@@ -412,7 +412,7 @@ che permettono di esaminare e modificare le directory, rinominare o cancellare
 i file, esaminare o settare i loro attributi.
 
 \subsection{La directory di lavoro}
-\label{sec:file_dir_cvd}
+\label{sec:file_dir_working}
 
 Come accennato ciascun processo è associato ad una directory nel filesystem
 che è chiamata directory corrente o directory di lavoro (\textit{current
@@ -427,8 +427,7 @@ un processo figlio, la directory corrente della shell diventa anche la
 directory corrente di qualunque comando da essa lanciato.
 
 Le funzioni qui descritte servono esaminare e cambiare la directory di lavoro
-corrente. I prototipi di queste funzioni sono dichiarati in
-\texttt{unistd.h}. 
+corrente. I prototipi di queste funzioni sono dichiarati in \texttt{unistd.h}. 
 
 \begin{itemize}
 \item \texttt{char * getcwd (char * buffer, size_t size)}
@@ -458,33 +457,50 @@ corrente. I prototipi di queste funzioni sono dichiarati in
 \end{itemize}
 
 Di questa funzione esiste una versione \texttt{char * getwd(char * buffer)}
-fatta per compatibilità ll'indietro con BSD, che non consente di specificare
+fatta per compatibilità all'indietro con BSD, che non consente di specificare
 la dimensione del buffer; esso deve essere allocato in precedenza ed avere una
 dimensione superiore a \texttt{PATH_MAX} (di solito 256 byters, vedi
 \ref{sec:xxxx_limits}; il problema è che in linux non esiste una dimensione
-superiore per un pathname, per cui noe è detto che il buffer sia sufficiente a
+superiore per un pathname, per cui non è detto che il buffer sia sufficiente a
 contenere il nome del file, e questa è la ragione principale per cui questa
 funzione è deprecata.
 
+Una seconda funzione simile è \texttt{char * get_current_dir_name(void)} che è
+sostanzialmente equivalente ad una \texttt{getcwd(NULL, 0)}, con la sola
+differenza che essa ritorna il valore della variabile di ambiente
+\texttt{PWD}, che essendo costruita dalla shell può contenere anche dei
+riferimenti simbolici.
+
+Come già detto in unix anche le directory sono file, è possibile pertanto
+(come vedremo in \ref{sec:file_dir_access}) riferirsi ad esse tramite il file
+descriptor dell'interfaccia a basso livello, e non solo tramite il filename;
+per questo motivo ci sono due diverse funzioni per cambiare directory di
+lavoro.
+
+\begin{itemize}
 \item \texttt{int chdir (const char * pathname)}
   
   Come dice il nome (che significa \textit{change directory}) questa funzione
   serve a cambiare la directory di lavoro a quella speficata dal pathname
   contenuto nella stringa \texttt{pathname}.
   
-  La funzione restituisce zero in caso di successo e -1 per un errore, in caso
-  di errore \texttt{errno} viene settata secondo i codici di errore standard
-  di accesso ai files (trattati in dettaglio in \ref{sec:file_err_acc}) ai
-  quali si aggiunge il codice \texttt{ENOTDIR} nel caso il \texttt{filename}
-  indichi un file che non sia una directory.
+\item \texttt{int fchdir (int filedes)} analoga alla precedente, ma usa un
+  file descriptor invece del pathname.
+
+
+  Entrambe le funzioni restituiscono zero in caso di successo e -1 per un
+  errore, in caso di errore \texttt{errno} viene settata secondo i codici di
+  errore standard di accesso ai files (trattati in dettaglio in
+  \ref{sec:file_err_acc}) ai quali si aggiunge il codice \texttt{ENOTDIR} nel
+  caso il \texttt{filename} indichi un file che non sia una directory.
 \end{itemize}
 
 \subsection{Creazione di una directory} 
+\label{sec:file_dir_creat}
 
 Per creare una nuova directory si può usare la seguente funzione, omonima
-dell'analogo comando di shell \texttt{mkdir}
-
+dell'analogo comando di shell \texttt{mkdir}; per accedere alla funzioni il
+programma deve includere il file \texttt{sys/stat.h}.
 
 \begin{itemize}
 \item \texttt{char * mkdir (const char * dirname, mode_t mode)}
@@ -516,11 +532,24 @@ dell'analogo comando di shell \texttt{mkdir}.
  
 
 \subsection{Accesso alle directory}
+\label{sec:file_dir_access}
 
 Benchè le directory siano oggetti del filesystem come tutti gli altri non ha
 ovviamente senso aprirle come fossero dei file di dati. Può però essere utile
 poterne leggere il contenuto ad esempio per fare la lista dei file che esse
-contengono o ricerche sui medesimi.
+contengono o ricerche sui medesimi..
+
+Per accedere al contenuto delle directory si usano i cosiddetti
+\textit{directory streams} (chiamati così per l'analogia con i file stream);
+la funzione \texttt{opendir} apre uno di questi stream e la funzione
+\texttt{readdir} legge il contenuto della directory, i cui elementi sono le
+\textit{directory entries} (da distinguersi da quelle della cache di cui
+parlavamo in \ref{sec:file_vfs}) in una opportuna struttura \texttt{struct
+dirent}.
+
+
+
+
 
 
 \section{L'input/output di basso livello}