X-Git-Url: https://gapil.gnulinux.it/gitweb/?a=blobdiff_plain;f=files.tex;h=c0b2ee107636a4a44dc06cf6671802b7b2054660;hb=502b29c2ea16e1ca2b335bf066ea445ad692345c;hp=8a1af4dcb38e703eac18004aef01ee7cc0d017c5;hpb=c1b9de7b110a01b3c3454b0a7a3041bc0b0f75fd;p=gapil.git diff --git a/files.tex b/files.tex index 8a1af4d..c0b2ee1 100644 --- a/files.tex +++ b/files.tex @@ -327,8 +327,7 @@ sistemi POSIX uno degli attributi di un file aperto 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à @@ -413,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 @@ -428,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)} @@ -459,23 +457,98 @@ 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}, 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}. + + +