X-Git-Url: https://gapil.gnulinux.it/gitweb/?a=blobdiff_plain;f=filedir.tex;h=cf928fc21cc347155c99d76b14f332075def4910;hb=fb2937152ac00dcf1536534a215adaa8fc4fd2d3;hp=c5f46756d453a2f904c6ceff6389c33f7401d6b6;hpb=ec4626071b61ac03bf8aa2f6d0dbe6da7d3ddf46;p=gapil.git diff --git a/filedir.tex b/filedir.tex index c5f4675..cf928fc 100644 --- a/filedir.tex +++ b/filedir.tex @@ -3,16 +3,12 @@ In questo capitolo tratteremo in dettaglio le varie caratteristiche di files e directories, ed in particolare approfondiremo i dettagli su come è organizzata -la struttura dei files in un sistema unix; esamineremo poi come è strutturato -il sistema base di protezioni e controllo di accesso ai files, e tutta +la struttura dei files in un sistema unix, esamineremo come è strutturato il +sistema base di protezioni e controllo di accesso ai files, e tutta l'interfaccia che permette la manipolazione dei vari attributi di files e directories. Tutto quello che riguarda invece la manipolazione dei contenuti è lasciato ai capitoli successivi. -Le funzioni che esamineremo in questo capitolo pertanto sono quelle che -permettono di creare e cancellare o leggere le directories, rinominare o -cancellare i files ed esaminare o cambiare i loro attributi. - \section{L'organizzazione di files e directories} \label{sec:filedir_org} @@ -35,10 +31,10 @@ directory; l'albero viene appunto creato inserendo directory in altre directory. Il nome completo di file generico è composto da una serie di questi -\textsl{componenti} separati da una \texttt{/} (in linux più \texttt{/} +\textsl{componenti} separati da una \texttt{/} (in Linux più \texttt{/} consecutive sono considerate equivalenti ad una sola). Il nome completo di un file viene usualmente chiamato \textit{pathname}, e anche se il manuale della -glibc depreca questo nome (poichè genererebbe confusione, dato che con +glibc depreca questo nome (poiché genererebbe confusione, dato che con \textit{path} si indica anche un insieme di directory su cui effettuare una ricerca, come quello in cui si cercano i comandi) l'uso è ormai così comune che è senz'altro più chiaro dell'alternativa proposta. @@ -53,7 +49,7 @@ permessi devono consentire l'accesso. Se il pathname comincia per \texttt{/} la ricerca parte dalla directory radice del processo; questa, a meno di un \textit{chroot} (su cui torneremo in -seguito, vedi \secref{sec:proc_chroot}) è la stessa per tutti i processi ed +seguito, vedi \secref{sec:xxx_chroot}) è la stessa per tutti i processi ed equivale alla directory radice dell'albero (come descritto in \secref{sec:fileintr_overview}): in questo caso si parla di un pathname \textsl{assoluto}. Altrimenti la ricerca parte dalla directory corrente (su @@ -67,7 +63,7 @@ la directory che contiene il riferimento alla directory corrente; nel caso questa sia la directory radice allora il riferimento è a se stessa. -\section{L'architettura di gestione dei file} +\section{L'architettura della gestione dei file} \label{sec:filedir_file_handling} Per capire fino in fondo le proprietà di files e directories in un sistema @@ -82,9 +78,9 @@ nel kernel) in \secref{sec:fileintr_vfs}. \subsection{Il funzionamento di un filesystem unix} \label{sec:filedir_filesystem} -Come già accennato in \secref{sec:fileintr_overview} linux (ed ogni unix in +Come già accennato in \secref{sec:fileintr_overview} Linux (ed ogni unix in generale) organizza i dati che tiene su disco attraverso l'uso di un -filesystem. Una delle caratteristiche di linux rispetto agli altri unix è +filesystem. Una delle caratteristiche di Linux rispetto agli altri unix è quella di poter supportare grazie al VFS una enorme quantità di filesystem diversi, ognuno dei quali ha una sua particolare struttura e funzionalità proprie; per questo non entreremo nei dettagli di un filesystem specifico, ma @@ -113,7 +109,7 @@ del tipo di quella esposta in \nfig. \caption{Organizzazione di un filesystem} \label{fig:filedir_filesys_detail} \end{figure} -da questa figura si evidenzano alcune caratteristiche su cui è bene porre +da questa figura si evidenziano alcune caratteristiche su cui è bene porre attenzione in quanto sono fondamentali per capire il funzionamento delle funzioni che manipolano i file e le directory su cui torneremo fra poco; in particolare è opportuno ricordare sempre che: @@ -188,7 +184,7 @@ particolare preferenza rispetto agli altri. Per aggiungere un nome ad un inode si utilizza la funzione \texttt{link}; si suole chiamare questo tipo di associazione un collegamento diretto (o -\textit{hard link}). Il prototipo della funzione e le sue caratteritiche +\textit{hard link}). Il prototipo della funzione e le sue caratteristiche principali, come risultano dalla man page, sono le seguenti: \begin{prototype}{unistd.h} {int link(const char * oldpath, const char * newpath)} @@ -202,8 +198,7 @@ principali, come risultano dalla man page, sono le seguenti: \item \texttt{EXDEV} \texttt{oldpath} e \texttt{newpath} non sono sullo stesso filesystem. \item \texttt{EPERM} il filesystem che contiene \texttt{oldpath} e - \texttt{newpath} non supporta i link diretti, oppure \texttt{oldpath} è - una directory. + \texttt{newpath} non supporta i link diretti o è una directory. \item \texttt{EFAULT} una delle stringhe passate come parametri è fuori dello spazio di indirizzi del processo. \item \texttt{EACCESS} errore di accesso (mancano i permessi per scrivere o @@ -238,7 +233,7 @@ richiamato in diverse directory. Per quanto dicevamo in \secref{sec:filedir_filesystem} la creazione del collegamento diretto è possibile solo se entrambi i pathname sono nello stesso -filesytem; inoltre il filesystem deve supportare i collegamenti diretti (non è +filesystem; inoltre il filesystem deve supportare i collegamenti diretti (non è il caso ad esempio del filesystem \texttt{vfat} di windows). La funzione opera sui file ordinari, come sugli altri oggetti del filesystem, @@ -247,7 +242,7 @@ un'altra directory, questo lo si fa perch dei circoli nel filesystem (vedi \secref{sec:filedir_symlink}) che molti programmi non sono in grado di gestire e la cui rimozione diventa estremamente complicata (in genere occorre far girare il programma \texttt{fsck} per -riparare il filesystem); data la sua pericolosità in linux questa +riparare il filesystem); data la sua pericolosità in Linux questa caratteristica è stata disabilitata, e la funzione restituisce l'errore \texttt{EPERM}. @@ -268,10 +263,13 @@ effettua con la funzione \texttt{unlink}; il suo prototipo \item \texttt{EACCESS} errore di accesso (mancano i permessi per scrivere o per attraversare le directories), vedi \secref{sec:filedir_access_control} per i dettagli. - \item \texttt{EPERM} il filesystem che contiene \texttt{pathname} non - consente l'operazione. - \item \texttt{EFAULT} la stringa passata come parametro è fuori dello spazio - di indirizzi del processo. + \item \texttt{EISDIR} \texttt{pathname} si riferisce ad una directory + (valore specifico ritornato da linux che non consente l'uso di + \texttt{unlink} con le directory, e non conforme allo standard POSIX, che + prescrive invece l'uso di \texttt{EPERM} in caso l'operazione non sia + consnetita o il processo non abbia privilegi sufficienti). + \item \texttt{EFAULT} la stringa + passata come parametro è fuori dello spazio di indirizzi del processo. \item \texttt{ENAMETOOLONG} il pathname troppo lungo. \item \texttt{ENOENT} uno dei componenti del pathname non esiste o è un link simbolico spezzato. @@ -313,7 +311,7 @@ crash dei programmi; la tecnica \subsection{Le funzioni \texttt{remove} e \texttt{rename}} \label{sec:filedir_cre_canc} -Al contrario di quanto avviene con altri unix in linux non è possibile usare +Al contrario di quanto avviene con altri unix in Linux non è possibile usare \texttt{unlink} sulle directory, per cancellare una directory si può usare la funzione \texttt{rmdir} (vedi \secref{sec:filedir_dir_creat_rem}), oppure la funzione \texttt{remove}. Questa è la funzione prevista dallo standard ANSI C @@ -344,29 +342,43 @@ nuovo nome dopo che il vecchio qual caso il file non viene toccato. La variabile \texttt{errno} viene settata secondo i seguenti codici di errore: \begin{errlist} - \item \texttt{EFAULT} la stringa \texttt{filename} è fuori dello spazio di - indirizzi del processo. + \item \texttt{EISDIR} \texttt{newpath} è una directory già esistente mentre + \texttt{oldpath} non è una directory. + \item \texttt{EXDEV} \texttt{oldpath} e \texttt{newpath} non sono sullo + stesso filesystem. + \item \texttt{ENOTEMPTY} \texttt{newpath} è una directory già esistente e + non vuota. + \item \texttt{EBUSY} o \texttt{oldpath} o \texttt{newpath} sono in uso da + parte di qualche processo (come directory di lavoro o come root) o del + sistema (come mount point). + \item \texttt{EINVAL} \texttt{newpath} contiene un prefisso di + \texttt{oldpath} o più in generale si è cercato di creare una directory + come sottodirectory di se stessa. + \item \texttt{EMLINK} \texttt{oldpath} ha già il massimo numero di link + consentiti o è una directory e la directory che contiene \texttt{newpath} + ha già il massimo numero di link. + \item \texttt{ENOTDIR} Uno dei componenti dei pathname non è una directory + o\texttt{oldpath} è una directory e \texttt{newpath} esiste e non è una + directory. + \item \texttt{EFAULT} o \texttt{oldpath} o \texttt{newpath} è fuori dello + spazio di indirizzi del processo. \item \texttt{EACCESS} Non c'è il permesso di scrittura per la directory in cui si vuole creare il nuovo link o una delle directory del pathname non consente la ricerca (permesso di esecuzione). - \item \texttt{EPERM} il pathname indica una directory o il filesystem che - contiene \texttt{filename} non consente l'operazione. - \item \texttt{EROFS} I file sono su un filesystem montato in sola lettura. - \item \texttt{ENAMETOOLONG} il pathname è troppo lungo. + \item \texttt{EPERM} le directory contenenti \texttt{oldpath} o + \texttt{newpath} hanno lo sticky bit attivo e i permessi del processo non + consentono rispettivamente la cancellazione e la creazione del file, o il + filesystem non supporta i link. + \item \texttt{ENAMETOOLONG} uno dei pathname è troppo lungo. \item \texttt{ENOENT} Uno dei componenti del pathname non esiste o è un link simbolico spezzato. - \item \texttt{ENOTDIR} Uno dei componenti del pathname non è una directory. - \item \texttt{ENOMEM} Memoria insufficiente nel kernel. + \item \texttt{ENOMEM} il kernel non ha a disposizione memoria sufficiente a + completare l'operazione. + \item \texttt{EROFS} I file sono su un filesystem montato in sola lettura. \item \texttt{ELOOP} Ci sono troppi link simbolici nella risoluzione del pathname. - \item \texttt{EISDIR} - \item \texttt{EXDEV} - \item \texttt{ENOTEMPTY} - \item \texttt{EBUSY} - \item \texttt{EINVAL} - \item \texttt{EMLINK} - \item \texttt{ENOSPC} - + \item \texttt{ENOSPC} Il device di destinazione non ha più spazio per la + nuova voce. \end{errlist} \end{prototype} @@ -376,7 +388,7 @@ nuovo nome dopo che il vecchio Siccome la funzione \texttt{link} crea riferimenti agli inodes, essa può funzionare soltanto per file che risiedono sullo stesso filesystem, dato che in questo caso è garantita l'unicità dell'inode, e solo per un filesystem di -tipo unix. Inoltre in linux non è consentito eseguire un link diretto ad una +tipo unix. Inoltre in Linux non è consentito eseguire un link diretto ad una directory. Per ovviare a queste limitazioni i sistemi unix supportano un'altra forma di @@ -426,11 +438,10 @@ questa funzione \begin{prototype}{unistd.h} {int readlink(const char * path, char * buff, size\_t size)} - Legge il contnuto del link simbolico indicato da \texttt{path} nel buffer + Legge il contenuto del link simbolico indicato da \texttt{path} nel buffer \texttt{buff} di dimensione \texttt{size}. Non chiude la stringa con un carattere nullo e la tronca a \texttt{size} nel caso il buffer sia troppo - piccolo pe contenerla. - + piccolo per contenerla. La funzione restituisce il numero di caratteri letti dentro \texttt{buff} o -1 per un errore, in caso di errore. La variabile \texttt{errno} viene @@ -448,6 +459,99 @@ questa funzione \end{prototype} +\section{La manipolazione delle caratteristiche dei files} +\label{sec:filedir_infos} + +Come spiegato in \secref{sec:filedir_file_handling} tutte le informazioni +generali relative alle caratteristiche di ciascun file sono mantenute +nell'inode. Vedremo in questa sezione come sia possibile accedervi usando la +funzione \texttt{stat} ed esamineremo alcune funzioni utilizzabili per +manipolare una parte di questa informazione. Tutto quello che invece riguarda +il meccanismo di controllo di accesso ad i file e le relative funzioni di +manipolazione sarà invece esaminanto in \secref{sec:filedir_access_control}. + + +\subsection{Le funzioni \texttt{stat}, \texttt{fstat} e \texttt{lstat}} +\label{sec:filedir_stat} + +La lettura delle informazioni relative ai file è fatta attraverso la famiglia +delle funzioni \texttt{stat}, questa è la funzione che il comando \texttt{ls} +usa per poter stampare tutti i dati dei files; il prototipo della funzione è +il seguente; +\begin{prototype}{unistd.h} +{int stat(const char *file\_name, struct stat *buf)} + + La funzione restituisce zero in caso di successo e -1 per un errore, in caso + di errore \texttt{errno} viene settato ai valori: + \begin{errlist} + \item \texttt{EACCESS} Non c'è il permesso di accedere al file. + \item \texttt{ENOTDIR} Una componente del pathname non è una directory. + \item \texttt{EMLOOP} Ci sono troppi link simbolici nel pathname. + \item \texttt{EFAULT} I puntatori usati sono fuori dallo spazio di indirizzi + del processo. + \item \texttt{ENOMEM} il kernel non ha a disposizione memoria sufficiente a + completare l'operazione. + \item \texttt{ENAMETOOLONG} Il filename è troppo lungo. + \end{errlist} +\end{prototype} + +La struttura \texttt{stat} è definita nell'header \texttt{sys/stat.h} e in +generale dipende dall'implementazione, la versione usata da Linux è mostrata +in \nfig, così come riportata dalla man page (in realtà la definizione +effettivamente usata nel kernel dipende dall'archietettura e ha altri campi +riservati per estensioni come tempo più precisi, o per il padding dei campi). + +\begin{figure}[!htbp] + \footnotesize + \begin{lstlisting}{} +struct stat { + dev_t st_dev; /* device */ + ino_t st_ino; /* inode */ + mode_t st_mode; /* protection */ + nlink_t st_nlink; /* number of hard links */ + uid_t st_uid; /* user ID of owner */ + gid_t st_gid; /* group ID of owner */ + dev_t st_rdev; /* device type (if inode device) */ + off_t st_size; /* total size, in bytes */ + unsigned long st_blksize; /* blocksize for filesystem I/O */ + unsigned long st_blocks; /* number of blocks allocated */ + time_t st_atime; /* time of last access */ + time_t st_mtime; /* time of last modification */ + time_t st_ctime; /* time of last change */ +}; + \end{lstlisting} + \caption{La struttura \texttt{stat} per la lettura delle informazioni dei + file} + \label{fig:sock_sa_gen_struct} +\end{figure} + +Si noti come i vari membri della struttura siano specificati come tipi nativi +del sistema (di quelli definiti in \tabref{tab:xxx_sys_types}, e dichiarati in +\texttt{sys/types.h}) + + + +\subsection{I tipi di file} +\label{sec:filedir_file_types} + +Come riportato in \tabref{tab:fileintr_file_types} in linux oltre ai file e +alle directory esistono vari altri oggetti che possono stare su un filesystem; +il tipo di file è ritornato dalla \texttt{stat} nel campo \texttt{st\_mode}, +dato che il valore numerico può variare a seconda delle implementazioni + + +\subsection{La dimensione dei file} +\label{sec:filedir_file_size} + +\subsection{I tempi dei file} +\label{sec:filedir_file_times} + +\subsection{La funzione \texttt{utime}} +\label{sec:filedir_utime} + + + + \section{Il controllo di accesso ai file} \label{sec:filedir_access_control} @@ -467,14 +571,13 @@ questa funzione \subsection{Le funzioni \texttt{chmod} e \texttt{fchmod}} \label{sec:filedir_chmod} -\subsection{Il flag \texttt{stiky}} -\label{sec:filedir_stiky} +\subsection{Il flag \texttt{sticky}} +\label{sec:filedir_sticky} \subsection{Le funzioni \texttt{chown}, \texttt{fchown} e \texttt{lchown}} \label{sec:filedir_chown} - \section{La manipolazione delle directories} \label{sec:filedir_dir_handling} @@ -499,9 +602,9 @@ programma deve includere il file \texttt{sys/types.h}. \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{EEXIST} Un file (o una directory) con quel nome esiste 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 + 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. @@ -516,7 +619,7 @@ programma deve includere il file \texttt{sys/types.h}. \subsection{Accesso alle directory} \label{sec:filedir_dir_read} -Benchè le directory siano oggetti del filesystem come tutti gli altri non ha +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. @@ -555,7 +658,7 @@ corrente. specificare un puntatore nullo come \textit{buffer}, nel qual caso la stringa sarà allocata automaticamente per una dimensione pari a \texttt{size} qualora questa sia diversa da zero, o della lunghezza esatta - del pathname altrimenti. In questo caso si deve ricordare di disallocara la + del pathname altrimenti. In questo caso si deve ricordare di disallocare la stringa una volta cessato il suo utilizzo. La funzione restituisce il puntatore \texttt{buffer} se riesce, @@ -566,7 +669,7 @@ corrente. è nullo. \item \texttt{ERANGE} L'argomento \texttt{size} è più piccolo della lunghezza del pathname. - \item \texttt{EACCES} Manca il permesso di lettura o di ricerca su uno dei + \item \texttt{EACCESS} Manca il permesso di lettura o di ricerca su uno dei componenti del pathname (cioè su una delle directory superiori alla corrente). \end{errlist} @@ -575,8 +678,8 @@ corrente. Di questa funzione esiste una versione \texttt{char * getwd(char * buffer)} 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 -\secref{sec:xxx_limits}; il problema è che in linux non esiste una dimensione +dimensione superiore a \texttt{PATH\_MAX} (di solito 256 bytes, vedi +\secref{sec:xxx_limits}; il problema è che in Linux non esiste una dimensione 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. @@ -594,7 +697,7 @@ per cambiare directory di lavoro. \begin{prototype}{unistd.h}{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 + serve a cambiare la directory di lavoro a quella specificata dal pathname contenuto nella stringa \texttt{pathname}. \end{prototype} @@ -610,26 +713,6 @@ per cambiare directory di lavoro. \end{prototype} -\section{La manipolazione delle caratteristiche dei files} -\label{sec:filedir_infos} - - -\subsection{Le funzioni \texttt{stat}, \texttt{fstat} e \texttt{lstat}} -\label{sec:filedir_stat} - -\subsection{I tipi di file} -\label{sec:filedir_file_types} - -\subsection{La dimensione dei file} -\label{sec:filedir_file_size} - -\subsection{I tempi dei file} -\label{sec:filedir_file_times} - -\subsection{La funzione \texttt{utime}} -\label{sec:filedir_utime} - - %La struttura fondamentale che contiene i dati essenziali relativi ai file è il