X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=filedir.tex;h=56f71b87a7a76ed4c0803f4a31226a18ccf1932d;hp=19f347dddcf1bcc312bd0ba7da98f455bd8ff347;hb=0ab3f419ed7721862f3a3bc012d681fbefdf0cfa;hpb=3e5c39bbc24981125adb422a672fcd3d54493bb6 diff --git a/filedir.tex b/filedir.tex index 19f347d..56f71b8 100644 --- a/filedir.tex +++ b/filedir.tex @@ -69,7 +69,7 @@ principali, come risultano dalla man page, sono le seguenti: già. \item \macro{EMLINK} ci sono troppi link al file \var{oldpath} (il numero massimo è specificato dalla variabile \macro{LINK\_MAX}, vedi - \secref{sec:xxx_limits}). + \secref{sec:sys_limits}). \end{errlist} ed inoltre \macro{EACCES}, \macro{ENAMETOOLONG}, \macro{ENOTDIR}, \macro{EFAULT}, \macro{ENOMEM}, \macro{EROFS}, \macro{ELOOP}, @@ -108,7 +108,6 @@ funzione restituisce l'errore \macro{EPERM}. La rimozione di un file (o più precisamente della voce che lo referenzia all'interno di una directory) si effettua con la funzione \func{unlink}; il suo prototipo è il seguente: - \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 @@ -143,9 +142,9 @@ restrizioni 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. +nell'inode deve essere una operazione atomica (si veda +\secref{cha:proc_atom_oper}), 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 @@ -173,7 +172,6 @@ funzione \func{remove}. Questa per cancellare un file o una directory (e funziona anche per i sistemi che non supportano i link diretti). Per i file è identica a \func{unlink} e per le directory è identica a \func{rmdir}: - \begin{prototype}{stdio.h}{int remove(const char *pathname)} Cancella un nome dal filesystem. Usa \func{unlink} per i file e \func{rmdir} per le directory. @@ -187,7 +185,6 @@ Per cambiare nome ad un file o a una directory (che devono comunque essere nello stesso filesystem) si usa invece la funzione \func{rename}\footnote{la funzione è definita dallo standard ANSI C solo per i file, POSIX estende la funzione anche alle directory}, il cui prototipo è: - \begin{prototype}{stdio.h} {int rename(const char *oldpath, const char *newpath)} @@ -276,7 +273,6 @@ funzioni di libreria (come \func{open} o \func{stat}) dare come parametro un link simbolico comporta 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 * oldpath, const char * newpath)} Crea un nuovo link simbolico di nome \func{newpath} il cui contenuto è @@ -355,7 +351,6 @@ Dato che, come indicato in \tabref{tab:file_symb_effect}, funzioni come la alle informazioni del link invece che a quelle del file a cui esso fa riferimento. Quando si vuole leggere il contenuto di un link simbolico si usa la funzione \func{readlink}, il cui prototipo è: - \begin{prototype}{unistd.h} {int readlink(const char * path, char * buff, size\_t size)} Legge il contenuto del link simbolico indicato da \var{path} nel buffer @@ -383,7 +378,7 @@ stringa con un carattere nullo e la tronca alla dimensione specificata da \begin{figure}[htb] \centering - \includegraphics[width=5cm]{img/link_loop.eps} + \includegraphics[width=5cm]{img/link_loop} \caption{Esempio di loop nel filesystem creato con un link simbolico.} \label{fig:file_link_loop} \end{figure} @@ -436,7 +431,6 @@ Queste due funzioni servono per creare e cancellare delle directory e sono omonime degli analoghi comandi di shell. Per poter accedere ai tipi usati da queste funzioni si deve includere il file \file{sys/types.h}, il prototipo della prima è: - \begin{prototype}{sys/stat.h} {int mkdir (const char * dirname, mode\_t mode)} Crea una nuova directory vuota con il nome indicato da \var{dirname}, @@ -474,7 +468,6 @@ titolarit La seconda funzione serve ad eliminare una directory già vuota (la directory deve cioè contenere soltanto le due voci standard \file{.} e \file{..}); il suo prototipo è: - \begin{prototype}{sys/stat.h} {int rmdir (const char * dirname)} Cancella la directory \var{dirname}, che deve essere vuota. Il nome può essere indicato con il pathname assoluto o @@ -548,7 +541,6 @@ directory corrente di qualunque comando da essa lanciato. In genere il kernel tiene traccia per ciascun processo dell'inode della directory di lavoro corrente, per ottenere il pathname occorre usare una apposita funzione di libreria, \func{getcwd}, il cui prototipo è: - \begin{prototype}{unistd.h}{char * getcwd (char * buffer, size\_t size)} Restituisce il filename completo della directory di lavoro corrente nella stringa puntata da \var{buffer}, che deve essere precedentemente @@ -582,7 +574,7 @@ Di questa funzione esiste una versione \func{char * getwd(char * buffer)} fatta per compatibilità all'indietro con BSD, che non consente di specificare la dimensione del buffer; esso deve essere allocato in precedenza ed avere una dimensione superiore a \macro{PATH\_MAX} (di solito 256 byte, vedi -\secref{sec:xxx_limits}); il problema è che in Linux non esiste una dimensione +\secref{sec:sys_limits}); il problema è che in Linux non esiste una dimensione superiore per un pathname, per cui non è detto che il buffer sia sufficiente a contenere il nome del file, e questa è la ragione principale per cui questa funzione è deprecata. @@ -600,7 +592,6 @@ nome (che deriva da \textit{change directory}), per cambiare la directory di lavoro corrente. Dato che anche le directory sono file, è possibile riferirsi ad esse anche tramite il file descriptor dell'interfaccia a basso livello, e non solo tramite il filename, i prototipi di queste funzioni sono: - \begin{functions} \headdecl{unistd.h} \funcdecl{int chdir (const char * path)} @@ -1014,7 +1005,6 @@ esiste. I tempi di ultimo accesso e modifica possono essere cambiati usando la funzione \func{utime}, il cui prototipo è: - \begin{prototype}{utime.h} {int utime(const char * filename, struct utimbuf *times)} @@ -1393,7 +1383,6 @@ l'\acr{uid} dell'utente che ha lanciato il programma, che, come accennato in \secref{sec:file_suid_sgid} e spiegato in \secref{sec:proc_perms} non è detto sia uguale all'\textit{effective user id}). Per far questo si può usare la funzione \func{access}, il cui prototipo è: - \begin{prototype}{unistd.h} {int access(const char *pathname, int mode)} @@ -1420,7 +1409,6 @@ possa scrivere come in un file, e il fatto che un file abbia permesso di esecuzione non comporta che contenga un programma eseguibile. La funzione ritorna zero solo se tutte i permessi controllati sono disponibili, in caso contrario (o di errore) ritorna -1. - \begin{table}[htb] \centering \footnotesize @@ -1452,7 +1440,6 @@ accedere ad un certo file. Per cambiare i permessi di un file il sistema mette ad disposizione due funzioni, che operano rispettivamente su un filename e su un file descriptor, i loro prototipi sono: - \begin{functions} \headdecl{sys/types.h} \headdecl{sys/stat.h} @@ -1551,7 +1538,6 @@ privilegio. Oltre che dai valori indicati in sede di creazione, i permessi assegnati ai nuovi file sono controllati anche da una maschera di bit settata con la funzione \func{umask}, il cui prototipo è: - \begin{prototype}{stat.h} {mode\_t umask(mode\_t mask)} @@ -1588,7 +1574,6 @@ allora occorrer Come per i permessi, il sistema fornisce anche delle funzioni che permettano di cambiare utente e gruppo cui il file appartiene; le funzioni in questione sono tre e i loro prototipi sono i seguenti: - \begin{functions} \headdecl{sys/types.h} \headdecl{sys/stat.h}