X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=filedir.tex;h=a8b3a8beb2b959193d127858cb07296729976f02;hp=ecabab0f6aa07cc148f8df4c684a27d2ec2d062e;hb=3784ad7b630a8e2cfa43d2a8c86dcce4d55dcd1c;hpb=4826742c87d76af810c8a30e5495135fb43b8091 diff --git a/filedir.tex b/filedir.tex index ecabab0..a8b3a8b 100644 --- a/filedir.tex +++ b/filedir.tex @@ -188,10 +188,10 @@ particolare preferenza rispetto agli altri. Per aggiungere un nome ad un inode si utilizza la funzione \texttt{link}; si suole chiamare questo tipo di associazione un collegamento diretto (o -\textit{hard link}). Il prototipo della funzione, definita in -\texttt{unistd.h}, e le sue caratteritiche principali, come risultano dalla -man page, sono le seguenti: -\begin{prototype}{int link(const char * oldname, const char * newname)} +\textit{hard link}). Il prototipo della funzione e le sue caratteritiche +principali, come risultano dalla man page, sono le seguenti: +\begin{prototype}{unistd.h} +{int link(const char * oldname, const char * newname)} Crea un nuovo collegamento diretto al file indicato da \texttt{oldname} dandogli nome \texttt{newname}. @@ -236,35 +236,38 @@ non sono in grado di gestire e la cui rimozione diventa estremamente 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, definito in -\texttt{unistd.h} è il seguente: +effettua con la funzione \texttt{unlink}; il suo prototipo è il seguente: -\begin{prototype}{int unlink(const char * filename)} +\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} @@ -272,7 +275,7 @@ Per cancellare una voce in una directory 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). @@ -291,11 +294,18 @@ usata per essere sicuri di non lasciare file temporanei su disco in caso di 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} @@ -303,7 +313,7 @@ Siccome la funzione \texttt{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 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, @@ -325,7 +335,8 @@ riferimento. Le funzioni per operare sui link simbolici sono le seguenti, esse sono tutte dichiarate nell'header file \texttt{unistd.h}. -\begin{prototype}{int symlink(const char * oldname, const char * newname)} +\begin{prototype}{unistd.h} +{int symlink(const char * oldname, const char * newname)} Crea un nuovo link simbolico al file indicato da \texttt{oldname} dandogli nome \texttt{newname}. @@ -350,10 +361,11 @@ dichiarate nell'header file \texttt{unistd.h}. \label{sec:filedir_dir_creat_rem} Per creare una nuova directory si può usare la seguente funzione, omonima -dell'analogo comando di shell \texttt{mkdir}; per accedere alla funzioni il -programma deve includere il file \texttt{sys/stat.h}. +dell'analogo comando di shell \texttt{mkdir}; per accedere ai tipi usati +programma deve includere il file \texttt{sys/types.h}. -\begin{prototype}{char * mkdir (const char * dirname, mode\_t mode)} +\begin{prototype}{sys/stat.h} +{int mkdir (const char * dirname, mode\_t mode)} Questa funzione crea una nuova directory vuota con il nome indicato da \texttt{dirname}, assegnandole i permessi indicati da \texttt{mode}. Il nome può essere indicato con il pathname assoluto o relativo. @@ -413,9 +425,9 @@ un processo figlio, la directory corrente della shell diventa anche la directory corrente di qualunque comando da essa lanciato. Le funzioni qui descritte servono esaminare e cambiare la directory di lavoro -corrente. I prototipi di queste funzioni sono dichiarati in \texttt{unistd.h}. +corrente. -\begin{prototype}{char * getcwd (char * buffer, size\_t size)} +\begin{prototype}{unistd.h}{char * getcwd (char * buffer, size\_t size)} Restituisce il filename completo della directory di lavoro corrente nella stringa puntata da \texttt{buffer}, che deve essere precedentemente allocata, per una dimensione massima di \texttt{size}. Si può anche @@ -459,13 +471,13 @@ riferirsi ad esse tramite il file descriptor dell'interfaccia a basso livello, e non solo tramite il filename; per questo motivo ci sono due diverse funzioni per cambiare directory di lavoro. -\begin{prototype}{int chdir (const char * pathname)} +\begin{prototype}{unistd.h}{int chdir (const char * pathname)} Come dice il nome (che significa \textit{change directory}) questa funzione serve a cambiare la directory di lavoro a quella speficata dal pathname contenuto nella stringa \texttt{pathname}. \end{prototype} -\begin{prototype}{int fchdir (int filedes)} +\begin{prototype}{unistd.h}{int fchdir (int filedes)} Analoga alla precedente, ma usa un file descriptor invece del pathname. Entrambe le funzioni restituiscono zero in caso di successo e -1 per un