X-Git-Url: https://gapil.gnulinux.it/gitweb/?a=blobdiff_plain;f=filedir.tex;h=1928eb65bcf8458937e4cfcd6603fe77085cb02c;hb=f38129d2f5315923568792875a9fa1fdb5e45d6e;hp=34e64d9ddc6929cf1bc41a6f9cf8ee6886493daf;hpb=ae0f5a752ec86bf15b78031f4b33664a8c0b515b;p=gapil.git diff --git a/filedir.tex b/filedir.tex index 34e64d9..1928eb6 100644 --- a/filedir.tex +++ b/filedir.tex @@ -6,7 +6,7 @@ directories, ed in particolare approfondiremo i dettagli su come 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 l'interfaccia che permette la manipolazione dei vari attributi di files e -directories. Tutto quello che riguarda invece la manipolazione dei contenuti 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 @@ -67,8 +67,8 @@ la directory che contiene il riferimento alla directory corrente; nel caso questa sia la directory radice allora il riferimento è a se stessa. -\section{La manipolazione di files e directories} -\label{sec:filedir_handling} +\section{La manipolazione dei files} +\label{sec:filedir_file_handling} Per capire fino in fondo le proprietà di files e directories in un sistema unix ed il funzionamento delle relative funzioni di manipolazione occorre una @@ -236,34 +236,38 @@ 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). - La rimozione di un file (o più precisamente della voce che lo referenzia) si effettua con la funzione \texttt{unlink}; il suo prototipo è il seguente: \begin{prototype}{unistd.h}{int unlink(const char * filename)} Cancella il nome specificato dal pathname nella relativa directory e - decrementa il numero di riferimenti nel relativo inode. + decrementa il numero di riferimenti nel relativo inode. Nel caso di link + simbolico cancella il link simbolico; nel caso di socket, fifo o file di + dispositivo rimuove il nome, ma come per i file i processi che hanno aperto + uno di questi oggetti possono continuare ad utilizzarlo. La funzione restituisce zero in caso di successo e -1 per un errore, nel qual caso il file non viene toccato. La variabile \texttt{errno} viene settata secondo i seguenti codici di errore: \begin{errlist} - \item \texttt{EXDEV} \texttt{oldname} e \texttt{newname} non sono sullo - stesso filesystem. - \item \texttt{EPERM} il filesystem che contiene \texttt{oldname} e - \texttt{newname} non supporta i link diretti. - \item \texttt{EACCESS} - Non c'è il permesso di scrittura per la directory in cui si vuole creare - il nuovo link. - \item \texttt{EEXIST} Un file (o una directory) con quel nome esiste di - già. - \item \texttt{EMLINK} Ci sono troppi link al file \texttt{oldname} (il - numero massimo è specificato dalla variabile \texttt{LINK\_MAX}, vedi - \secref{sec:xxx_limits}. - \item \texttt{ENOSPC} La directory in cui si vuole creare il link è piena e - non può essere ampliata. - \item \texttt{EROFS} La directory su cui si vuole inserire il nuovo link è - su un filesystem montato readonly. + \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} \texttt{filename} è su un filesystem montato in sola + lettura. + \item \texttt{EFAULT} la stringa \texttt{filename} è 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. + \item \texttt{ENOTDIR} Uno dei componenti del pathname non è una directory. + \item \texttt{EISDIR} il pathname indica una directory. + \item \texttt{ENOMEM} Memoria insufficiente nel kernel. + \item \texttt{ELOOP} Ci sono troppi link simbolici nella risoluzione del + pathname. + \item \texttt{EIO} Errore di input/output. \end{errlist} \end{prototype} @@ -271,7 +275,7 @@ Per cancellare una voce in una directory scrittura su di essa (dato che si va a rimuovere una voce dal suo contenuto) e il diritto di esecuzione sulla directory che la contiene (torneremo in dettaglio sui permessi e gli attributi fra poco), se inoltre lo -\textit{sticky} bit è settato occorerà anche essere proprietari del file o +\textit{sticky} bit è settato occorrerà anche essere proprietari del file o proprietari della directory (o root, per cui nessuna delle restrizioni è applicata). @@ -290,10 +294,81 @@ usata per essere sicuri di non lasciare file temporanei su disco in caso di crash dei programmi; la tecnica è quella di aprire il file e chiamare \texttt{unlink} subito dopo. - \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 +\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 +per cancellare un file (e funziona anche per i sistemi che non supportano i +link diretti), che per i file è identica alla \texttt{unlink} e per le +directory è identica alla \texttt{rmdir}: + +\begin{prototype}{stdio.h}{int remove(const char *pathname)} + Cancella un nome dal filesystem. Usa \texttt{unlink} per i file e + \texttt{rmdir} per le directory. + + La funzione restituisce zero in caso di successo e -1 per un errore, nel + qual caso il file non viene toccato. La variabile \texttt{errno} viene + settata secondo i seguenti codici di errore: + \begin{errlist} {NDT da rivedere} + \item \texttt{EFAULT} la stringa \texttt{filename} è 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} \texttt{filename} è su un filesystem montato in sola + lettura. + \item \texttt{ENAMETOOLONG} il 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{ELOOP} Ci sono troppi link simbolici nella risoluzione del + pathname. + \end{errlist} +\end{prototype} + +Per cambiare nome ad un file si usa invece la funzione \texttt{rename}, il +vantaggio nell'uso di questa funzione al posto della chiamata successiva di +\texttt{unlink} e \texttt{link} è che l'operazione è eseguita atomicamente. + +\begin{prototype}{stdio.h} +{int rename(const char *oldpath, const char *newpath)} + Rinomina un file, spostandolo fra directory diverse quando richiesto. + + La funzione restituisce zero in caso di successo e -1 per un errore, nel + qual caso il file non viene toccato. La variabile \texttt{errno} viene + settata secondo i seguenti codici di errore: + \begin{errlist} {NDT da rivedere} + \item \texttt{EFAULT} la stringa \texttt{filename} è 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{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{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} + + \end{errlist} +\end{prototype} \subsection{I link simbolici} \label{sec:filedir_sym_link} @@ -302,7 +377,7 @@ 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 -directory se non si è root. +directory. Per ovviare a queste limitazioni i sistemi unix supportano un'altra forma di link (i cosiddetti \textit{soft link} o \textit{symbolic link}), che sono, @@ -333,7 +408,7 @@ dichiarate nell'header file \texttt{unistd.h}. di errore. La variabile \texttt{errno} viene settata secondo i codici di errore standard di accesso ai files (trattati in dettaglio in \secref{sec:filedir_access_control}) ai quali si aggiungono i seguenti: - \begin{errlist} + \begin{errlist} {NDT da rivedere} \item \texttt{EEXIST} Un file (o una directory) con quel nome esiste di già. \item \texttt{EROFS} La directory su cui si vuole inserire il nuovo link è @@ -345,12 +420,69 @@ dichiarate nell'header file \texttt{unistd.h}. \end{errlist} \end{prototype} +Dato che la funzione \texttt{open} segue i link simbolici, è necessaria usare +un'altra funzione quando si vuole leggere il contenuto di un link simbolico, +questa funzione è la: + +\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 + \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. + + + 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 + settata secondo i codici di errore: + \begin{errlist} {NDT da rivedere} + \item \texttt{EEXIST} Un file (o una directory) con quel nome esiste di + già. + \item \texttt{EROFS} La directory su cui si vuole inserire il nuovo link è + su un filesystem montato readonly. + \item \texttt{ENOSPC} La directory o il filesystem in cui si vuole creare il + link è piena e non c'è ulteriore spazio disponibile. + \item \texttt{ELOOP} Ci sono troppi link simbolici nella risoluzione di + \texttt{oldname} o di \texttt{newname}. + \end{errlist} +\end{prototype} + + +\section{Il controllo di accesso ai file} +\label{sec:filedir_access_control} + + +\subsection{I flag \texttt{suid} e \texttt{sgid}} +\label{sec:filedir_suid_sgid} + +\subsection{La titolarità di nuovi files e directory} +\label{sec:filedir_ownership} + +\subsection{La funzione \texttt{access}} +\label{sec:filedir_access} + +\subsection{La funzione \texttt{umask}} +\label{sec:filedir_umask} + +\subsection{Le funzioni \texttt{chmod} e \texttt{fchmod}} +\label{sec:filedir_chmod} + +\subsection{Il flag \texttt{stiky}} +\label{sec:filedir_stiky} + +\subsection{Le funzioni \texttt{chown}, \texttt{fchown} e \texttt{lchown}} +\label{sec:filedir_chown} + + + +\section{La manipolazione delle directories} +\label{sec:filedir_dir_handling} \subsection{Le funzioni \texttt{mkdir} e \texttt{rmdir}} \label{sec:filedir_dir_creat_rem} Per creare una nuova directory si può usare la seguente funzione, omonima -dell'analogo comando di shell \texttt{mkdir}; per accedere ai tipi usati +dell'analogo comando di shell \texttt{mkdir}; per accedere ai tipi usati programma deve includere il file \texttt{sys/types.h}. \begin{prototype}{sys/stat.h} @@ -478,15 +610,10 @@ 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} @@ -504,32 +631,6 @@ per cambiare directory di lavoro. -\section{Il controllo di accesso ai file} -\label{sec:filedir_access_control} - - -\subsection{I flag \texttt{suid} e \texttt{sgid}} -\label{sec:filedir_suid_sgid} - -\subsection{La titolarità di nuovi files e directory} -\label{sec:filedir_ownership} - -\subsection{La funzione \texttt{access}} -\label{sec:filedir_access} - -\subsection{La funzione \texttt{umask}} -\label{sec:filedir_umask} - -\subsection{Le funzioni \texttt{chmod} e \texttt{fchmod}} -\label{sec:filedir_chmod} - -\subsection{Il flag \texttt{stiky}} -\label{sec:filedir_stiky} - -\subsection{Le funzioni \texttt{chown}, \texttt{fchown} e \texttt{lchown}} -\label{sec:filedir_chown} - - %La struttura fondamentale che contiene i dati essenziali relativi ai file è il %cosiddetto \textit{inode}; questo conterrà informazioni come il