Se \var{oldpath} è una directory allora \var{newpath} se esiste deve essere
una directory vuota, altrimenti si avranno gli errori \macro{ENOTDIR} (se non
è una directory) o \macro{ENOTEMPTY} (se non è vuota). Chiaramente
-\var{newpath} non può contenere \var{oldpath}.
+\var{newpath} non può contenere \var{oldpath} altrimenti si avrà un errore
+\macro{EINVAL}.
-Se \var{oldpath} si riferisce a un link simbolico questo sara rinominato; se
+Se \var{oldpath} si riferisce a un link simbolico questo sarà rinominato; se
\var{newpath} è un link simbolico verrà cancellato come qualunque altro file.
Infine qualora \var{oldpath} e \var{newpath} siano due nomi dello stesso file
lo standard POSIX prevede che la funzione non dia errore, e non faccia nulla,
esistere una finestra in cui sia \var{oldpath} che \var{newpath} fanno
riferimento allo stesso file.
+
\subsection{I link simbolici}
\label{sec:file_symlink}
-Siccome la funzione \func{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.
+Come abbiamo visto in \secref{sec:file_link} la funzione \func{link} crea
+riferimenti agli inodes, pertanto può funzionare soltanto per file che
+risiedono sullo stesso filesysteme solo per un filesystem di tipo unix.
+Inoltre abbiamo visto che in Linux non è consentito eseguire un link diretto
+ad una 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,
-come avviene in altri sistemi operativi, dei file che contengono il
+come avviene in altri sistemi operativi, dei file speciali che contengono il
semplicemente il riferimento ad un altro file (o directory). In questo modo è
-possibile effettuare link anche attraverso filesystem diversi e a directory, e
-pure a file che non esistono ancora.
+possibile effettuare link anche attraverso filesystem diversi, in filesystem
+che non supportano i link diretti, link alle directory, e pure a file che non
+esistono ancora.
Il sistema funziona in quanto i link simbolici sono contrassegnati come tali
-al kernel (analogamente a quanto avviene per le directory) per cui la chiamata
-ad una \var{open} o una \var{stat} su un link simbolico comporta la lettura
-del contenuto del medesimo e l'applicazione della funzione al file specificato
-da quest'ultimo. Invece altre funzioni come quelle per cancellare o rinominare
-i file operano direttamente sul link simbolico (per l'elenco vedi \ntab).
-Inoltre esistono funzioni apposite, come la \func{readlink} e la \func{lstat}
-per accedere alle informazioni del link invece che a quelle del file a cui
-esso fa riferimento.
-
-Le funzioni per operare sui link simbolici sono le seguenti, esse sono tutte
-dichiarate nell'header file \file{unistd.h}.
+al kernel (analogamente a quanto avviene per le directory) per cui per alcune
+funzioni di libreria (come \func{open} o \func{stat}) l'indicazione di un link
+simbolico l'applicazione della funzione al file da esso specificato. La
+funzione che permette di creare un nuovo link simbolico è \func{symlink}; il
+suo prototipo è:
\begin{prototype}{unistd.h}
-{int symlink(const char * oldname, const char * newname)}
- Crea un nuovo link simbolico al file indicato da \var{oldname} dandogli
- nome \func{newname}.
+ {int symlink(const char * oldpath, const char * newpath)}
+ Crea un nuovo link simbolico di nome \func{newpath} il cui contenuto è
+ \func{oldpath}.
- La funzione restituisce zero in caso di successo e -1 per un errore, in caso
- di errore. La variabile \var{errno} viene settata secondo i codici di
- errore standard di accesso ai file (trattati in dettaglio in
- \secref{sec:file_access_control}) ai quali si aggiungono i seguenti:
+ La funzione restituisce zero in caso di successo e -1 per un errore, nel
+ qual caso la variabile \var{errno} restituisce i valori:
\begin{errlist}
- \item \macro{EEXIST} Un file (o una directory) con quel nome esiste di
- già.
- \item \macro{EROFS} La directory su cui si vuole inserire il nuovo link è
- su un filesystem montato in sola lettura.
- \item \macro{ENOSPC} La directory o il filesystem in cui si vuole creare il
- link è piena e non c'è ulteriore spazio disponibile.
- \item \macro{ELOOP} Ci sono troppi link simbolici nella risoluzione di
- \var{oldname} o di \var{newname}.
+ \item \macro{EEXIST} esiste già un file \var{newpath}.
+ \item \macro{EROFS} \var{newpath} è su un filesystem montato in sola lettura.
+ \item \macro{ENOENT} una componente di \var{newpath} non esiste o
+ \func{oldpath} è una stringa vuota.
\end{errlist}
+ ed inoltre \macro{ENAMETOOLONG}, \macro{ENOSPC}, \macro{ENOMEM},
+ \macro{ELOOP}, \macro{EACCES}, \macro{EIO} e \macro{ENOTDIR}.
\end{prototype}
-Dato che, come indicato in \secref{tab:file_symb_effect}, la funzione
-\func{open} segue i link simbolici, è necessaria usare un'altra funzione
-quando si vuole leggere il contenuto di un link simbolico, questa funzione è
-la:
+
+
+
+
+
+Inoltre esistono funzioni apposite, come la \func{readlink} e la \func{lstat}
+per accedere alle informazioni del link invece che a quelle del file a cui
+esso fa riferimento. Dato che, come indicato in \secref{tab:file_symb_effect},
+la funzione \func{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)}
che viene passato alla subroutine è una copia del valore attuale di quella
variabile, copia che la subroutine potrà modificare a piacere, senza che il
valore originale nella routine chiamante venga toccato. In questo modo non
-occorre preoccuparsi di eventuali effetti delle operazioni della subroutine.
+occorre preoccuparsi di eventuali effetti delle operazioni della subroutine
+sulla variabile passata come parametro.
-La maggior parte delle funzioni di libreria e delle system call funziona
-esattamente in questo modo restituendo eventuali risultati alla routine
-chiamante attraverso il valore di ritorno. Talvolta però è necessario che la
-funzione possa restituire indietro alla funzione chiamate un valore relativo
-ad uno dei sui parametri.
+Questo però va inteso nella maniera corretta. Il passaggio \textit{by value}
+vale per qualunque variabile, puntatori compresi; quando però in una
+subroutine si usano dei puntatori (ad esempio per scrivere in un buffer) in
+realtà si va a modificare la zona di memoria a cui essi puntano, per cui anche
+se i puntatori sono copie, i dati a cui essi puntano sono sempre gli stessi, e
+le eventuali modifiche avranno effetto e saranno visibili anche nella routine
+chiamante.
+Nella maggior parte delle funzioni di libreria e delle system call i puntatori
+vengono usati per scambiare dati (attraverso buffer o strutture) e le
+variabili semplici vengono usate per specificare parametri; in genere le
+informazioni a riguardo dei risultati vengono passate alla routine chiamante
+attraverso il valore di ritorno. Talvolta però è necessario che la funzione
+possa restituire indietro alla funzione chiamate un valore relativo ad uno dei
+suoi parametri. Per far questo si usa il cosiddetto \textit{}. Pertanto occorre
+tenere conto che quando si vuole restituire un risultato alla funzione
+chiamante occorre usare un puntatore.
\label{sec:proc_auto_var}
+
\subsection{Il controllo di flusso non locale}
\label{sec:proc_longjmp}