complicata (in genere occorre far girare il programma \texttt{fsck} per
riparare il filesystem).
-
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)}
Cancella il nome specificato dal pathname nella relativa directory e
- decrementa il numero di riferimenti nel relativo inode.
+ 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
+ dispositivo rimuove il nome, ma come per i file i processi che hanno aperto
+ uno di questi oggetti possono continuare ad utilizzarlo.
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}
- \item \texttt{EXDEV} \texttt{oldname} e \texttt{newname} 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
- già.
- \item \texttt{EMLINK} Ci sono troppi link al file \texttt{oldname} (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.
+ \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
+ 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
+ pathname.
+ \item \texttt{EIO} Errore di input/output.
\end{errlist}
\end{prototype}
scrittura su di essa (dato che si va a rimuovere una voce dal suo contenuto) e
il diritto di esecuzione sulla directory che la contiene (torneremo in
dettaglio sui permessi e gli attributi fra poco), se inoltre lo
-\textit{sticky} bit è settato occorerà anche essere proprietari del file o
+\textit{sticky} bit è settato occorrerà anche essere proprietari del file o
proprietari della directory (o root, per cui nessuna delle restrizioni è
applicata).
crash dei programmi; la tecnica è quella di aprire il file e chiamare
\texttt{unlink} subito dopo.
+Al contrario di quanto avviene con altri unix in linux non è possibile usare
+\texttt{unlink} per cancellare una directory
+
+
\subsection{Le funzioni \texttt{remove} e \texttt{rename}}
\label{sec:filedir_cre_canc}
+
+
+
\subsection{I link simbolici}
\label{sec:filedir_sym_link}
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 se non si è root.
+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,