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},
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
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
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.
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)}
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 è
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
\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}
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},
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
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
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.
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)}
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)}
\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)}
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
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}
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)}
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}