From 502b29c2ea16e1ca2b335bf066ea445ad692345c Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Tue, 20 Mar 2001 19:40:20 +0000 Subject: [PATCH] Roba (pallosa) sulle directory --- files.tex | 57 +++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 43 insertions(+), 14 deletions(-) diff --git a/files.tex b/files.tex index 4f5e304..c0b2ee1 100644 --- 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} -- 2.30.2