From: Simone Piccardi Date: Mon, 29 Oct 2001 18:56:18 +0000 (+0000) Subject: Correzioni varie. X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=commitdiff_plain;h=16e64b5dbce90526045cf9c0c95690c08d64a2dc Correzioni varie. --- diff --git a/filedir.tex b/filedir.tex index f5261b3..ad97494 100644 --- a/filedir.tex +++ b/filedir.tex @@ -235,9 +235,10 @@ cancellato e rimpiazzato (atomicamente). 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, @@ -258,60 +259,59 @@ presente una istanza di \var{newpath}, tuttavia nella sovrascrittura potr 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)} diff --git a/process.tex b/process.tex index d3fa51d..5114b01 100644 --- a/process.tex +++ b/process.tex @@ -961,14 +961,26 @@ Il passaggio di una variabile \textit{by value} significa che in realt 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. @@ -976,6 +988,7 @@ ad uno dei sui parametri. \label{sec:proc_auto_var} + \subsection{Il controllo di flusso non locale} \label{sec:proc_longjmp}