file, cioè il punto nel file in cui verrebbe letto o scritto alla operazione
successiva. Essa è rappresentata da un numero intero che indica il numero di
bytes dall'inizio del file, che viene (a meno che non si apra il file in
-append) inizializzato a zero all'apertura del medesimo.
-
+append) inizializzato a zero all'apertura del medesimo.
Questo è uno dei dati che viene mantenuto nella suddetta struttura, per cui
ogni processo avrà la sua posizione corrente nel file, che non sarà
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
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)}
\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}, come l'omonimo
- comando di shell) questa funzione serve a cambiare la directory di lavoro a
- quella speficata dal pathname contenuto nella stringa \texttt{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}.
+
+\item \texttt{int fchdir (int filedes)} analoga alla precedente, ma usa un
+ file descriptor invece del pathname.
- La funzione restituisce zero in caso di successo e -1 per un errore,
-
+
+ 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}; 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)}
+
+ Questa funzione crea una nuova directory vuota con il nome indicato da
+ \texttt{dirname}, assegnandole i permessi indicati da \texttt{mode}. Il nome
+ può essere indicato con il pathname assoluto o relativo.
+
+ 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 aggiungono i seguenti:
+ \begin{itemize}
+ \item \texttt{EACCESS}
+ Non c'è il permesso di scrittura per la directory in cui si vuole inserire
+ la nuova directory.
+ \item \texttt{EEXIST} Un file (o una directory) con quel nome essite di già
+ \item \texttt{EMLINK} La directory in cui si vuole creare la nuova directory
+ contiene troppi file. Sotto linux questo normalmente non avviene perchè il
+ filesystem standard consente la creazione di un numero di file maggiore di
+ quelli che possono essere contenuti nell'hard-disk, ma potendo avere a che
+ fare anche con filesystem di altri sistemi questo errore può presentarsi
+ \item \texttt{ENOSPC} Non c'è abbastanza spazio sul file system per creare
+ la nuova directory.
+ \item \texttt{EROFS} La directory su cui si vuole inserire la nuova
+ directory è su un filesystem monto readonly.
+ \end{itemize}
\end{itemize}
+
+
+\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..
+
+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}.
+
+
+