In questo capitolo tratteremo in dettaglio le varie caratteristiche di files e
directories, ed in particolare approfondiremo i dettagli su come è organizzata
-la struttura dei files in un sistema unix; esamineremo poi come è strutturato
-il sistema base di protezioni e controllo di accesso ai files, e tutta
+la struttura dei files in un sistema unix, esamineremo come è strutturato il
+sistema base di protezioni e controllo di accesso ai files, e tutta
l'interfaccia che permette la manipolazione dei vari attributi di files e
-directories. Tutto quello che riguarda invece la manipolazione dei contenuti e
+directories. Tutto quello che riguarda invece la manipolazione dei contenuti è
lasciato ai capitoli successivi.
-Le funzioni che esamineremo in questo capitolo pertanto sono quelle che
-permettono di creare e cancellare o leggere le directories, rinominare o
-cancellare i files ed esaminare o cambiare i loro attributi.
-
\section{L'organizzazione di files e directories}
\label{sec:filedir_org}
directory.
Il nome completo di file generico è composto da una serie di questi
-\textsl{componenti} separati da una \texttt{/} (in linux più \texttt{/}
+\textsl{componenti} separati da una \texttt{/} (in Linux più \texttt{/}
consecutive sono considerate equivalenti ad una sola). Il nome completo di un
file viene usualmente chiamato \textit{pathname}, e anche se il manuale della
-glibc depreca questo nome (poichè genererebbe confusione, dato che con
+glibc depreca questo nome (poiché genererebbe confusione, dato che con
\textit{path} si indica anche un insieme di directory su cui effettuare una
ricerca, come quello in cui si cercano i comandi) l'uso è ormai così comune
che è senz'altro più chiaro dell'alternativa proposta.
Se il pathname comincia per \texttt{/} la ricerca parte dalla directory radice
del processo; questa, a meno di un \textit{chroot} (su cui torneremo in
-seguito, vedi \secref{sec:proc_chroot}) è la stessa per tutti i processi ed
+seguito, vedi \secref{sec:xxx_chroot}) è la stessa per tutti i processi ed
equivale alla directory radice dell'albero (come descritto in
\secref{sec:fileintr_overview}): in questo caso si parla di un pathname
\textsl{assoluto}. Altrimenti la ricerca parte dalla directory corrente (su
questa sia la directory radice allora il riferimento è a se stessa.
-\section{La manipolazione di files e directories}
-\label{sec:filedir_handling}
+\section{L'architettura di gestione dei file}
+\label{sec:filedir_file_handling}
Per capire fino in fondo le proprietà di files e directories in un sistema
unix ed il funzionamento delle relative funzioni di manipolazione occorre una
-breve introduzione agli oggetti su cui è basato un filesystem unix; in
-particolare si riprenderà, approfondendolo sul piano dell'uso nelle funzioni
-di libreria, il concetto di \textit{inode} di cui abbiamo brevemente accennato
-le caratteristiche (dal lato dell'implementazione nel kernel) in
-\secref{sec:fileintr_vfs}.
+breve introduzione sulla gestione dei medesimo e sugli oggetti su cui è basato
+un filesystem unix; in particolare si riprenderà, approfondendolo sul piano
+dell'uso nelle funzioni di libreria, il concetto di \textit{inode} di cui
+abbiamo brevemente accennato le caratteristiche (dal lato dell'implementazione
+nel kernel) in \secref{sec:fileintr_vfs}.
-\subsection{Il funzionamento di un filesystem}
+\subsection{Il funzionamento di un filesystem unix}
\label{sec:filedir_filesystem}
-Come già accennato in \secref{sec:fileintr_overview} linux (ed ogni unix in
+Come già accennato in \secref{sec:fileintr_overview} Linux (ed ogni unix in
generale) organizza i dati che tiene su disco attraverso l'uso di un
-filesystem. Una delle caratteristiche di linux rispetto agli altri unix è
+filesystem. Una delle caratteristiche di Linux rispetto agli altri unix è
quella di poter supportare grazie al VFS una enorme quantità di filesystem
diversi, ognuno dei quali ha una sua particolare struttura e funzionalità
proprie; per questo non entreremo nei dettagli di un filesystem specifico, ma
\caption{Organizzazione di un filesystem}
\label{fig:filedir_filesys_detail}
\end{figure}
-da questa figura si evidenzano alcune caratteristiche su cui è bene porre
+da questa figura si evidenziano alcune caratteristiche su cui è bene porre
attenzione in quanto sono fondamentali per capire il funzionamento delle
funzioni che manipolano i file e le directory su cui torneremo fra poco; in
particolare è opportuno ricordare sempre che:
\item Come mostrato in \curfig si possono avere più voci che puntano allo
stesso \textit{inode}. Ogni \textit{inode} ha un contatore che contiene il
- numero di riferimenti (\textit{link count}) che sono stati fatti ad esso,
+ numero di riferimenti (\textit{link count}) che sono stati fatti ad esso;
solo quando questo contatore si annulla i dati del file vengono
effettivamente rimossi dal disco. Per questo la funzione per cancellare un
file si chiama \texttt{unlink}, ed in realtà non cancella affatto i dati del
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)}
- Crea un nuovo collegamento diretto al file indicato da \texttt{oldname}
- dandogli nome \texttt{newname}.
+\textit{hard link}). Il prototipo della funzione e le sue caratteristiche
+principali, come risultano dalla man page, sono le seguenti:
+\begin{prototype}{unistd.h}
+{int link(const char * oldpath, const char * newpath)}
+ Crea un nuovo collegamento diretto al file indicato da \texttt{oldpath}
+ dandogli nome \texttt{newpath}.
La funzione restituisce zero in caso di successo e -1 per un errore, in caso
di errore. 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
+ \item \texttt{EXDEV} \texttt{oldpath} e \texttt{newpath} 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
+ \item \texttt{EPERM} il filesystem che contiene \texttt{oldpath} e
+ \texttt{newpath} non supporta i link diretti, oppure \texttt{oldpath} è
+ una directory.
+ \item \texttt{EFAULT} una delle stringhe passate come parametri è fuori
+ dello spazio di indirizzi del processo.
+ \item \texttt{EACCESS} errore di accesso (mancano i permessi per scrivere o
+ per attraversare le directories), vedi \secref{sec:filedir_access_control}
+ per i dettagli.
+ \item \texttt{ENAMETOOLONG} una dei due pathname è troppo lungo.
+ \item \texttt{ENOENT} un componente di \texttt{oldpath} o \texttt{newpath}
+ non esiste o è un link simbolico spezzato.
+ \item \texttt{ENOTDIR} un componente di \texttt{oldpath} o \texttt{newpath}
+ non è una directory.
+ \item \texttt{ENOMEM} il kernel non ha a disposizione memoria sufficiente a
+ completare l'operazione.
+ \item \texttt{EROFS} la directory su cui si vuole inserire il nuovo link è
+ su un filesystem montato readonly.
+ \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
+ \item \texttt{EMLINK} ci sono troppi link al file \texttt{oldpath} (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.
+ \secref{sec:xxx_limits}).
+ \item \texttt{ELOOP} si incontrati troppi link simbolici nella risoluzione
+ di \texttt{oldpath} o \texttt{newpath}.
+ \item \texttt{ENOSPC} la directory in cui si vuole creare il link non ha
+ spazio per ulteriori voci.
+ \item \texttt{EIO} c'è stato un errore di input/output.
\end{errlist}
\end{prototype}
Per quanto dicevamo in \secref{sec:filedir_filesystem} la creazione del
collegamento diretto è possibile solo se entrambi i pathname sono nello stesso
-filesytem; inoltre il filesystem deve supportare i collegamenti diretti (non è
+filesystem; inoltre il filesystem deve supportare i collegamenti diretti (non è
il caso ad esempio del filesystem \texttt{vfat} di windows).
La funzione opera sui file ordinari, come sugli altri oggetti del filesystem,
ma solo l'amministratore è in grado di creare un collegamento diretto ad
un'altra directory, questo lo si fa perché in questo caso è possibile creare
-dei cerchi nel filesystem (vedi \secref{sec:filedir_symlink}) che molti programmi
-non sono in grado di gestire e la cui rimozione diventa estremamente
+dei circoli nel filesystem (vedi \secref{sec:filedir_symlink}) che molti
+programmi 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).
-
+riparare il filesystem); data la sua pericolosità in Linux questa
+caratteristica è stata disabilitata, e la funzione restituisce l'errore
+\texttt{EPERM}.
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 * pathname)}
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} errore di accesso (mancano i permessi per scrivere o
+ per attraversare le directories), vedi \secref{sec:filedir_access_control}
+ per i dettagli.
+ \item \texttt{EPERM} il filesystem che contiene \texttt{pathname} non
+ consente l'operazione.
+ \item \texttt{EFAULT} la stringa passata come parametro è 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} \texttt{pathname} fa riferimento a una directory.
+ \item \texttt{ENOMEM} il kernel non ha a disposizione memoria sufficiente a
+ completare l'operazione.
+ \item \texttt{EROFS} \texttt{pathname} è su un filesystem montato in sola
+ lettura.
+ \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).
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.
+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.
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
crash dei programmi; la tecnica è quella di aprire il file e chiamare
\texttt{unlink} subito dopo.
-
\subsection{Le funzioni \texttt{remove} e \texttt{rename}}
\label{sec:filedir_cre_canc}
+Al contrario di quanto avviene con altri unix in Linux non è possibile usare
+\texttt{unlink} sulle directory, per cancellare una directory si può usare la
+funzione \texttt{rmdir} (vedi \secref{sec:filedir_dir_creat_rem}), oppure la
+funzione \texttt{remove}. Questa è la funzione prevista dallo standard ANSI C
+per cancellare un file o una directory (e funziona anche per i sistemi che non
+supportano i link diretti), che per i file è identica alla \texttt{unlink} e
+per le directory è identica alla \texttt{rmdir}:
+
+\begin{prototype}{stdio.h}{int remove(const char *pathname)}
+ Cancella un nome dal filesystem. Usa \texttt{unlink} per i file e
+ \texttt{rmdir} per le directory.
+
+ La funzione restituisce zero in caso di successo e -1 per un errore, nel
+ qual caso il file non viene toccato. Per i codici di errori vedi quanto
+ riportato nella descrizione di \texttt{unlink} e \texttt{rmdir}.
+\end{prototype}
+
+Per cambiare nome ad un file si usa invece la funzione \texttt{rename}, il
+vantaggio nell'uso di questa funzione al posto della chiamata successiva di
+\texttt{unlink} e \texttt{link} è che l'operazione è eseguita atomicamente, in
+questo modo non c'è la possibilità che un processo che cerchi di accedere al
+nuovo nome dopo che il vecchio è stato cambiato lo trovi mancante.
+
+\begin{prototype}{stdio.h}
+{int rename(const char *oldpath, const char *newpath)}
+ Rinomina un file, spostandolo fra directory diverse quando richiesto.
+
+ 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{EFAULT} la stringa \texttt{filename} è fuori dello spazio di
+ indirizzi del processo.
+ \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} I file sono su un filesystem montato in sola lettura.
+ \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{ENOMEM} il kernel non ha a disposizione memoria sufficiente a
+ completare l'operazione.
+ \item \texttt{ELOOP} Ci sono troppi link simbolici nella risoluzione del
+ pathname.
+ \item \texttt{EISDIR}
+ \item \texttt{EXDEV}
+ \item \texttt{ENOTEMPTY}
+ \item \texttt{EBUSY}
+ \item \texttt{EINVAL}
+ \item \texttt{EMLINK}
+ \item \texttt{ENOSPC}
+
+ \end{errlist}
+\end{prototype}
\subsection{I link simbolici}
\label{sec:filedir_sym_link}
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.
+tipo unix. Inoltre 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,
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}.
\end{errlist}
\end{prototype}
+Dato che la funzione \texttt{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)}
+ Legge il contenuto del link simbolico indicato da \texttt{path} nel buffer
+ \texttt{buff} di dimensione \texttt{size}. Non chiude la stringa con un
+ carattere nullo e la tronca a \texttt{size} nel caso il buffer sia troppo
+ piccolo per contenerla.
+
+ La funzione restituisce il numero di caratteri letti dentro \texttt{buff} o
+ -1 per un errore, in caso di errore. La variabile \texttt{errno} viene
+ settata secondo i codici di errore:
+ \begin{errlist}
+ \item \texttt{EEXIST} Un file (o una directory) con quel nome esiste di
+ già.
+ \item \texttt{EROFS} La directory su cui si vuole inserire il nuovo link è
+ su un filesystem montato readonly.
+ \item \texttt{ENOSPC} La directory o il filesystem in cui si vuole creare il
+ link è piena e non c'è ulteriore spazio disponibile.
+ \item \texttt{ELOOP} Ci sono troppi link simbolici nella risoluzione di
+ \texttt{oldname} o di \texttt{newname}.
+ \end{errlist}
+\end{prototype}
+
+
+\section{La manipolazione delle caratteristiche dei files}
+\label{sec:filedir_infos}
+
+Come spiegato in \secref{sec:filedir_file_handling} tutte le informazioni
+generali relative alle caratteristiche di ciascun file sono mantenute
+nell'inode. Vedremo in questa sezione come sia possibile accedervi usando la
+funzione \texttt{stat} ed esamineremo alcune funzioni utilizzabili per
+manipolare una parte di questa informazione. Tutto quello che invece riguarda
+il meccanismo di controllo di accesso ad i file e le relative funzioni di
+manipolazione sarà invece esaminanto in \secref{sec:filedir_access_control}.
+
+
+\subsection{Le funzioni \texttt{stat}, \texttt{fstat} e \texttt{lstat}}
+\label{sec:filedir_stat}
+
+La lettura delle informazioni relative ai file è fatta attraverso la famiglia
+delle funzioni \texttt{stat}, questa è la funzione che il comando \texttt{ls}
+usa per poter stampare tutti i dati dei files; il prototipo della funzione è
+il seguente;
+\begin{prototype}{sys/stat.h}
+{int stat(const char *file_name, struct stat *buf)}
+
+ La funzione restituisce zero in caso di successo e -1 per un errore, in caso
+ di errore \texttt{errno} viene settato ai valori:
+ \begin{errlist}
+ \item \texttt{EACCESS} Non c'è il permesso di accedere al file.
+ \item \texttt{ENOTDIR} Una componente del pathname non è una directory.
+ \item \texttt{EMLOOP} Ci sono troppi link simbolici nel pathname.
+ \item \texttt{EFAULT} I puntatori usati sono fuori dallo spazio di indirizzi
+ del processo.
+ \item \texttt{ENOMEM} il kernel non ha a disposizione memoria sufficiente a
+ completare l'operazione.
+ \item \texttt{ENAMETOOLONG} Il filename è troppo lungo.
+ \end{errlist}
+\end{prototype}
+
+\subsection{I tipi di file}
+\label{sec:filedir_file_types}
+
+\subsection{La dimensione dei file}
+\label{sec:filedir_file_size}
+
+\subsection{I tempi dei file}
+\label{sec:filedir_file_times}
+
+\subsection{La funzione \texttt{utime}}
+\label{sec:filedir_utime}
+
+
+
+
+\section{Il controllo di accesso ai file}
+\label{sec:filedir_access_control}
+
+
+\subsection{I flag \texttt{suid} e \texttt{sgid}}
+\label{sec:filedir_suid_sgid}
+
+\subsection{La titolarità di nuovi files e directory}
+\label{sec:filedir_ownership}
+
+\subsection{La funzione \texttt{access}}
+\label{sec:filedir_access}
+
+\subsection{La funzione \texttt{umask}}
+\label{sec:filedir_umask}
+
+\subsection{Le funzioni \texttt{chmod} e \texttt{fchmod}}
+\label{sec:filedir_chmod}
+
+\subsection{Il flag \texttt{sticky}}
+\label{sec:filedir_sticky}
+
+\subsection{Le funzioni \texttt{chown}, \texttt{fchown} e \texttt{lchown}}
+\label{sec:filedir_chown}
+
+
+\section{La manipolazione delle directories}
+\label{sec:filedir_dir_handling}
\subsection{Le funzioni \texttt{mkdir} e \texttt{rmdir}}
\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.
\item \texttt{EACCESS}
Non c'è il permesso di scrittura per la directory in cui si vuole inserire
la nuova directory.
- \item \texttt{EEXIST} Un file (o una directory) con quel nome essite di già.
+ \item \texttt{EEXIST} Un file (o una directory) con quel nome esiste di già.
\item \texttt{EMLINK} La directory in cui si vuole creare la nuova directory
- contiene troppi file. Sotto linux questo normalmente non avviene perchè il
+ contiene troppi file. Sotto Linux questo normalmente non avviene perché il
filesystem standard consente la creazione di un numero di file maggiore di
quelli che possono essere contenuti nell'hard-disk, ma potendo avere a che
fare anche con filesystem di altri sistemi questo errore può presentarsi.
\subsection{Accesso alle directory}
\label{sec:filedir_dir_read}
-Benchè le directory siano oggetti del filesystem come tutti gli altri non ha
+Benché le directory siano oggetti del filesystem come tutti gli altri non ha
ovviamente senso aprirle come fossero dei file di dati. Può però essere utile
poterne leggere il contenuto ad esempio per fare la lista dei file che esse
contengono o ricerche sui medesimi.
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
specificare un puntatore nullo come \textit{buffer}, nel qual caso la
stringa sarà allocata automaticamente per una dimensione pari a
\texttt{size} qualora questa sia diversa da zero, o della lunghezza esatta
- del pathname altrimenti. In questo caso si deve ricordare di disallocara la
+ del pathname altrimenti. In questo caso si deve ricordare di disallocare la
stringa una volta cessato il suo utilizzo.
La funzione restituisce il puntatore \texttt{buffer} se riesce,
è nullo.
\item \texttt{ERANGE} L'argomento \texttt{size} è più piccolo della
lunghezza del pathname.
- \item \texttt{EACCES} Manca il permesso di lettura o di ricerca su uno dei
+ \item \texttt{EACCESS} Manca il permesso di lettura o di ricerca su uno dei
componenti del pathname (cioè su una delle directory superiori alla
corrente).
\end{errlist}
Di questa funzione esiste una versione \texttt{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 \texttt{PATH\_MAX} (di solito 256 byters, vedi
-\secref{sec:xxx_limits}; il problema è che in linux non esiste una dimensione
+dimensione superiore a \texttt{PATH\_MAX} (di solito 256 bytes, vedi
+\secref{sec:xxx_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.
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
+ serve a cambiare la directory di lavoro a quella specificata 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
-
-\section{La manipolazione delle caratteristiche dei files}
-\label{sec:filedir_infos}
-
-
-
-
-\subsection{Le funzioni \texttt{stat}, \texttt{fstat} e \texttt{lstat}}
-\label{sec:filedir_stat}
-
-\subsection{I tipi di file}
-\label{sec:filedir_file_types}
-
-\subsection{La dimensione dei file}
-\label{sec:filedir_file_size}
-
-\subsection{I tempi dei file}
-\label{sec:filedir_file_times}
-
-\subsection{La funzione \texttt{utime}}
-\label{sec:filedir_utime}
-
-
-
-\section{Il controllo di accesso ai file}
-\label{sec:filedir_access_control}
-
-
-\subsection{I flag \texttt{suid} e \texttt{sgid}}
-\label{sec:filedir_suid_sgid}
-
-\subsection{La titolarità di nuovi files e directory}
-\label{sec:filedir_ownership}
-
-\subsection{La funzione \texttt{access}}
-\label{sec:filedir_access}
-
-\subsection{La funzione \texttt{umask}}
-\label{sec:filedir_umask}
-
-\subsection{Le funzioni \texttt{chmod} e \texttt{fchmod}}
-\label{sec:filedir_chmod}
-
-\subsection{Il flag \texttt{stiky}}
-\label{sec:filedir_stiky}
-
-\subsection{Le funzioni \texttt{chown}, \texttt{fchown} e \texttt{lchown}}
-\label{sec:filedir_chown}
-
-
-
%La struttura fondamentale che contiene i dati essenziali relativi ai file è il
%cosiddetto \textit{inode}; questo conterrà informazioni come il
%tipo di file (file di dispositivo, directory, file di dati, per un elenco