Altre modifiche
[gapil.git] / filedir.tex
index ecabab0f6aa07cc148f8df4c684a27d2ec2d062e..1928eb65bcf8458937e4cfcd6603fe77085cb02c 100644 (file)
@@ -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
@@ -188,10 +188,10 @@ 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, definita in
-\texttt{unistd.h}, e le sue caratteritiche principali, come risultano dalla
-man page, sono le seguenti:
-\begin{prototype}{int link(const char * oldname, const char * newname)}
+\textit{hard link}).  Il prototipo della funzione e le sue caratteritiche
+principali, come risultano dalla man page, sono le seguenti:
+\begin{prototype}{unistd.h}
+{int link(const char * oldname, const char * newname)}
   Crea un nuovo collegamento diretto al file indicato da \texttt{oldname}
   dandogli nome \texttt{newname}.
   
@@ -236,35 +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, definito in
-\texttt{unistd.h} è il seguente:
+effettua con la funzione \texttt{unlink}; il suo prototipo è il seguente:
 
-\begin{prototype}{int unlink(const char * filename)}
+\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}
 
@@ -272,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).
 
@@ -291,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}
@@ -303,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,
@@ -325,7 +399,8 @@ riferimento.
 Le funzioni per operare sui link simbolici sono le seguenti, esse sono tutte
 dichiarate nell'header file \texttt{unistd.h}.
 
-\begin{prototype}{int symlink(const char * oldname, const char * newname)}
+\begin{prototype}{unistd.h}
+{int symlink(const char * oldname, const char * newname)}
   Crea un nuovo link simbolico al file indicato da \texttt{oldname} dandogli
   nome \texttt{newname}.
   
@@ -333,7 +408,34 @@ 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 è
+    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}
+
+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 è
@@ -346,14 +448,45 @@ dichiarate nell'header file \texttt{unistd.h}.
 \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 alla funzioni il
-programma deve includere il file \texttt{sys/stat.h}.
+dell'analogo comando di shell \texttt{mkdir}; per accedere ai tipi usati
+programma deve includere il file \texttt{sys/types.h}.
 
-\begin{prototype}{char * mkdir (const char * dirname, mode\_t mode)}
+\begin{prototype}{sys/stat.h}
+{int 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.
@@ -413,9 +546,9 @@ 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. 
 
-\begin{prototype}{char * getcwd (char * buffer, size\_t size)}
+\begin{prototype}{unistd.h}{char * getcwd (char * buffer, size\_t size)}
   Restituisce il filename completo della directory di lavoro corrente nella
   stringa puntata da \texttt{buffer}, che deve essere precedentemente
   allocata, per una dimensione massima di \texttt{size}. Si può anche
@@ -459,13 +592,13 @@ 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{prototype}{int chdir (const char * pathname)}
+\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
   contenuto nella stringa \texttt{pathname}.
 \end{prototype}
   
-\begin{prototype}{int fchdir (int filedes)} 
+\begin{prototype}{unistd.h}{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
@@ -477,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}
 
@@ -503,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