Sistemati un po` di typo e messi meglio gli errori di link e unlink (la man
authorSimone Piccardi <piccardi@gnulinux.it>
Thu, 17 May 2001 11:08:34 +0000 (11:08 +0000)
committerSimone Piccardi <piccardi@gnulinux.it>
Thu, 17 May 2001 11:08:34 +0000 (11:08 +0000)
page di quest'ultima e` pure sbagliata, orca zozza!).

elemtcp.tex
filedir.tex

index a2e77f9c86ca273db11957889223a728b0ae4e86..7816ec5dd84b7b4282fb906114fb51fc884497b2 100644 (file)
@@ -926,9 +926,8 @@ protocollo TCP.
 
 
 
-\begin{prototype}{sys/socket.h}{int listen(int sockfd, struct sockaddr *addr,
-    socklen_t *addrlen); }
-  
+\begin{prototype}{sys/socket.h}
+{int listen(int sockfd, struct sockaddr *addr, socklen\_t *addrlen)}  
   La funzione restituisce 0 in caso di successo e ... . I
   codici di errore restituiti in \texttt{errno} sono i seguenti:
   \begin{errlist}
index 1928eb65bcf8458937e4cfcd6603fe77085cb02c..c5f46756d453a2f904c6ceff6389c33f7401d6b6 100644 (file)
@@ -67,19 +67,19 @@ 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 dei files}
+\section{L'architettura di gestione dei file}
 \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
-breve introduzione agli oggetti su cui è basato un filesystem unix; in
-particolare si riprenderà, approfondendolo sul piano dell'uso nelle funzioni
-di libreria, il concetto di \textit{inode} di cui abbiamo brevemente accennato
-le caratteristiche (dal lato dell'implementazione nel kernel) in
-\secref{sec:fileintr_vfs}.
+breve introduzione sulla gestione dei medesimo e sugli oggetti su cui è basato
+un filesystem unix; in particolare si riprenderà, approfondendolo sul piano
+dell'uso nelle funzioni di libreria, il concetto di \textit{inode} di cui
+abbiamo brevemente accennato le caratteristiche (dal lato dell'implementazione
+nel kernel) in \secref{sec:fileintr_vfs}.
 
 
-\subsection{Il funzionamento di un filesystem}
+\subsection{Il funzionamento di un filesystem unix}
 \label{sec:filedir_filesystem}
 
 Come già accennato in \secref{sec:fileintr_overview} linux (ed ogni unix in
@@ -132,7 +132,7 @@ particolare 
   
 \item Come mostrato in \curfig si possono avere più voci che puntano allo
   stesso \textit{inode}. Ogni \textit{inode} ha un contatore che contiene il
-  numero di riferimenti (\textit{link count}) che sono stati fatti ad esso,
+  numero di riferimenti (\textit{link count}) che sono stati fatti ad esso;
   solo quando questo contatore si annulla i dati del file vengono
   effettivamente rimossi dal disco. Per questo la funzione per cancellare un
   file si chiama \texttt{unlink}, ed in realtà non cancella affatto i dati del
@@ -191,30 +191,43 @@ suole chiamare questo tipo di associazione un collegamento diretto (o
 \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}.
+{int link(const char * oldpath, const char * newpath)}
+  Crea un nuovo collegamento diretto al file indicato da \texttt{oldpath}
+  dandogli nome \texttt{newpath}.
   
   La funzione restituisce zero in caso di successo e -1 per un errore, in caso
   di errore. 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
+  \item \texttt{EXDEV} \texttt{oldpath} e \texttt{newpath} 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
+  \item \texttt{EPERM} il filesystem che contiene \texttt{oldpath} e
+    \texttt{newpath} non supporta i link diretti, oppure \texttt{oldpath} è
+    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
+    per attraversare le directories), vedi \secref{sec:filedir_access_control}
+    per i dettagli.
+  \item \texttt{ENAMETOOLONG} una dei due pathname è troppo lungo.
+  \item \texttt{ENOENT} un componente di \texttt{oldpath} o \texttt{newpath}
+    non esiste o è un link simbolico spezzato.
+  \item \texttt{ENOTDIR} un componente di \texttt{oldpath} o \texttt{newpath}
+    non è una directory.
+  \item \texttt{ENOMEM} il kernel non ha a disposizione memoria sufficiente a
+    completare l'operazione. 
+  \item \texttt{EROFS} la directory su cui si vuole inserire il nuovo link è
+    su un filesystem montato readonly.
+  \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
+  \item \texttt{EMLINK} ci sono troppi link al file \texttt{oldpath} (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.
+    \secref{sec:xxx_limits}).
+  \item \texttt{ELOOP} si incontrati troppi link simbolici nella risoluzione
+    di \texttt{oldpath} o \texttt{newpath}.
+  \item \texttt{ENOSPC} la directory in cui si vuole creare il link non ha
+    spazio per ulteriori voci.
+  \item \texttt{EIO} c'è stato un errore di input/output.
   \end{errlist}
 \end{prototype}
 
@@ -231,15 +244,17 @@ il caso ad esempio del filesystem \texttt{vfat} di windows).
 La funzione opera sui file ordinari, come sugli altri oggetti del filesystem,
 ma solo l'amministratore è in grado di creare un collegamento diretto ad
 un'altra directory, questo lo si fa perché in questo caso è possibile creare
-dei cerchi nel filesystem (vedi \secref{sec:filedir_symlink}) che molti programmi
-non sono in grado di gestire e la cui rimozione diventa estremamente
+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).
+riparare il filesystem); data la sua pericolosità in linux questa
+caratteristica è stata disabilitata, e la funzione restituisce l'errore
+\texttt{EPERM}.
 
 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)}
+\begin{prototype}{unistd.h}{int unlink(const char * pathname)}
   Cancella il nome specificato dal pathname nella relativa directory e
   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
@@ -250,24 +265,25 @@ effettua con la funzione \texttt{unlink}; il suo prototipo 
   qual caso il file non viene toccato. La variabile \texttt{errno} viene
   settata secondo i seguenti codici di errore:
   \begin{errlist}
-  \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
+  \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{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
+  \item \texttt{ENOTDIR} uno dei componenti del pathname non è una directory.
+  \item \texttt{EISDIR} \texttt{pathname} fa riferimento a una directory.
+  \item \texttt{ENOMEM} il kernel non ha a disposizione memoria sufficiente a
+    completare l'operazione. 
+  \item \texttt{EROFS} \texttt{pathname} è su un filesystem montato in sola
+    lettura.
+  \item \texttt{ELOOP} ci sono troppi link simbolici nella risoluzione del
     pathname.
-  \item \texttt{EIO} Errore di input/output.
+  \item \texttt{EIO} errore di input/output.
   \end{errlist}
 \end{prototype}
 
@@ -280,10 +296,10 @@ proprietari della directory (o root, per cui nessuna delle restrizioni 
 applicata).
 
 Una delle caratteristiche di queste funzioni è che la creazione/rimozione
-della nome dalla directory e l'incremento/decremento del numero di
-riferimenti nell'inode deve essere una operazione atomica (cioè non
-interrompibile da altri) processi, per questo entrambe queste funzioni sono
-realizzate tramite una singola system call.
+della nome dalla directory e l'incremento/decremento del numero di riferimenti
+nell'inode deve essere una operazione atomica (cioè non interrompibile da
+altri) processi, per questo entrambe queste funzioni sono realizzate tramite
+una singola system call.
 
 Si ricordi infine che il file non viene eliminato dal disco fintanto che tutti
 i riferimenti ad esso sono stati cancellati, solo quando il \textit{link
@@ -301,40 +317,24 @@ Al contrario di quanto avviene con altri unix in linux non 
 \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}:
+per cancellare un file o una directory (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}    
+  qual caso il file non viene toccato. Per i codici di errori vedi quanto
+  riportato nella descrizione di \texttt{unlink} e \texttt{rmdir}.
 \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.
+\texttt{unlink} e \texttt{link} è che l'operazione è eseguita atomicamente, in
+questo modo non c'è la possibilità che un processo che cerchi di accedere al
+nuovo nome dopo che il vecchio è stato cambiato lo trovi mancante.
 
 \begin{prototype}{stdio.h}
 {int rename(const char *oldpath, const char *newpath)}
@@ -343,7 +343,7 @@ vantaggio nell'uso di questa funzione al posto della chiamata successiva di
   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}
+  \begin{errlist} 
   \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
@@ -408,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} {NDT da rivedere}
+  \begin{errlist}
   \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 è
@@ -425,7 +425,7 @@ 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)} 
+{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
@@ -435,7 +435,7 @@ questa funzione 
   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}
+  \begin{errlist}
   \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 è