1 \chapter{Files e directories}
2 \label{cha:files_and_dirs}
4 In questo capitolo tratteremo in dettaglio le modalità con cui si gestiscono
5 files e directories, ed in particolare esamineremo come è strutturato il
6 sistema base di protezioni e controllo di accesso ai files, e tutta
7 l'interfaccia che permette la manipolazione dei vari attributi di files e
8 directories. Tutto quello che riguarda invece la manipolazione del contenuto
9 dei file è lasciato ai capitoli successivi.
12 \section{La gestione di file e directory}
14 Le prime funzioni che considereremo sono quelle relative alla gestione di file
15 e directory, secondo le caratteristiche standard che essi presentano in un
16 filesystem unix, già esaminate in precedenza (vedi
17 \secref{sec:fileintr_filesystem}).
19 \subsection{Le funzioni \texttt{link} e \texttt{unlink}}
20 \label{sec:fileintr_link}
22 Una delle caratteristiche usate quando si opera con i file è quella di poter
23 creare dei nomi fittizi (alias o collegamenti) per potersi riferire allo
24 stesso file accedendovi da directory diverse. Questo è possibile anche in
25 ambiente unix, dove tali collegamenti sono usualmente chiamati \textit{link},
26 ma data la struttura del sistema ci sono due metodi sostanzialmente diversi
27 per fare questa operazione.
29 Come si è appena detto l'accesso al contenuto di un file su disco avviene
30 attraverso il suo inode, e il nome che si trova in una directory è solo una
31 etichetta associata ad un puntatore a detto inode. Questo significa che la
32 realizzazione di un link è immediata in quanto uno stesso file può avere tanti
33 nomi diversi allo stesso tempo, dati da altrettante diverse associazioni allo
34 stesso inode; si noti poi che nessuno di questi nomi viene ad assumere una
35 particolare preferenza rispetto agli altri.
37 Per aggiungere un nome ad un inode si utilizza la funzione \texttt{link}; si
38 suole chiamare questo tipo di associazione un collegamento diretto (o
39 \textit{hard link}). Il prototipo della funzione e le sue caratteristiche
40 principali, come risultano dalla man page, sono le seguenti:
41 \begin{prototype}{unistd.h}
42 {int link(const char * oldpath, const char * newpath)}
43 Crea un nuovo collegamento diretto al file indicato da \texttt{oldpath}
44 dandogli nome \texttt{newpath}.
46 La funzione restituisce zero in caso di successo e -1 per un errore, in caso
47 di errore. La variabile \texttt{errno} viene settata secondo i seguenti
50 \item \texttt{EXDEV} \texttt{oldpath} e \texttt{newpath} non sono sullo
52 \item \texttt{EPERM} il filesystem che contiene \texttt{oldpath} e
53 \texttt{newpath} non supporta i link diretti o è una directory.
54 \item \texttt{EFAULT} una delle stringhe passate come parametri è fuori
55 dello spazio di indirizzi del processo.
56 \item \texttt{EACCESS} errore di accesso (mancano i permessi per scrivere o
57 per attraversare le directories), vedi \secref{sec:filedir_access_control}
59 \item \texttt{ENAMETOOLONG} una dei due pathname è troppo lungo.
60 \item \texttt{ENOENT} un componente di \texttt{oldpath} o \texttt{newpath}
61 non esiste o è un link simbolico spezzato.
62 \item \texttt{ENOTDIR} un componente di \texttt{oldpath} o \texttt{newpath}
64 \item \texttt{ENOMEM} il kernel non ha a disposizione memoria sufficiente a
65 completare l'operazione.
66 \item \texttt{EROFS} la directory su cui si vuole inserire il nuovo link è
67 su un filesystem montato readonly.
68 \item \texttt{EEXIST} un file (o una directory) con quel nome esiste di
70 \item \texttt{EMLINK} ci sono troppi link al file \texttt{oldpath} (il
71 numero massimo è specificato dalla variabile \texttt{LINK\_MAX}, vedi
72 \secref{sec:xxx_limits}).
73 \item \texttt{ELOOP} si incontrati troppi link simbolici nella risoluzione
74 di \texttt{oldpath} o \texttt{newpath}.
75 \item \texttt{ENOSPC} la directory in cui si vuole creare il link non ha
76 spazio per ulteriori voci.
77 \item \texttt{EIO} c'è stato un errore di input/output.
81 La creazione di un nuovo collegamento diretto non copia il contenuto del file,
82 ma si limita ad aumentare di uno il numero di referenze al file aggiungendo il
83 nuovo nome ai precedenti. Si noti che uno stesso file può essere così
84 richiamato in diverse directory.
86 Per quanto dicevamo in \secref{sec:fileintr_filesystem} la creazione del
87 collegamento diretto è possibile solo se entrambi i pathname sono nello stesso
88 filesystem; inoltre il filesystem deve supportare i collegamenti diretti (non è
89 il caso ad esempio del filesystem \texttt{vfat} di windows).
91 La funzione opera sui file ordinari, come sugli altri oggetti del filesystem,
92 ma solo l'amministratore è in grado di creare un collegamento diretto ad
93 un'altra directory, questo lo si fa perché in questo caso è possibile creare
94 dei circoli nel filesystem (vedi \secref{sec:fileintr_symlink}) che molti
95 programmi non sono in grado di gestire e la cui rimozione diventa estremamente
96 complicata (in genere occorre far girare il programma \texttt{fsck} per
97 riparare il filesystem); data la sua pericolosità in Linux questa
98 caratteristica è stata disabilitata, e la funzione restituisce l'errore
101 La rimozione di un file (o più precisamente della voce che lo referenzia) si
102 effettua con la funzione \texttt{unlink}; il suo prototipo è il seguente:
104 \begin{prototype}{unistd.h}{int unlink(const char * pathname)}
105 Cancella il nome specificato dal pathname nella relativa directory e
106 decrementa il numero di riferimenti nel relativo inode. Nel caso di link
107 simbolico cancella il link simbolico; nel caso di socket, fifo o file di
108 dispositivo rimuove il nome, ma come per i file i processi che hanno aperto
109 uno di questi oggetti possono continuare ad utilizzarlo.
111 La funzione restituisce zero in caso di successo e -1 per un errore, nel
112 qual caso il file non viene toccato. La variabile \texttt{errno} viene
113 settata secondo i seguenti codici di errore:
115 \item \texttt{EACCESS} errore di accesso (mancano i permessi per scrivere o
116 per attraversare le directories), vedi \secref{sec:filedir_access_control}
118 \item \texttt{EISDIR} \texttt{pathname} si riferisce ad una directory
119 (valore specifico ritornato da linux che non consente l'uso di
120 \texttt{unlink} con le directory, e non conforme allo standard POSIX, che
121 prescrive invece l'uso di \texttt{EPERM} in caso l'operazione non sia
122 consnetita o il processo non abbia privilegi sufficienti).
123 \item \texttt{EFAULT} la stringa
124 passata come parametro è fuori dello spazio di indirizzi del processo.
125 \item \texttt{ENAMETOOLONG} il pathname troppo lungo.
126 \item \texttt{ENOENT} uno dei componenti del pathname non esiste o è un link
128 \item \texttt{ENOTDIR} uno dei componenti del pathname non è una directory.
129 \item \texttt{EISDIR} \texttt{pathname} fa riferimento a una directory.
130 \item \texttt{ENOMEM} il kernel non ha a disposizione memoria sufficiente a
131 completare l'operazione.
132 \item \texttt{EROFS} \texttt{pathname} è su un filesystem montato in sola
134 \item \texttt{ELOOP} ci sono troppi link simbolici nella risoluzione del
136 \item \texttt{EIO} errore di input/output.
140 Per cancellare una voce in una directory è necessario avere il permesso di
141 scrittura su di essa (dato che si va a rimuovere una voce dal suo contenuto) e
142 il diritto di esecuzione sulla directory che la contiene (torneremo in
143 dettaglio sui permessi e gli attributi fra poco), se inoltre lo
144 \textit{sticky} bit è settato occorrerà anche essere proprietari del file o
145 proprietari della directory (o root, per cui nessuna delle restrizioni è
148 Una delle caratteristiche di queste funzioni è che la creazione/rimozione
149 della nome dalla directory e l'incremento/decremento del numero di riferimenti
150 nell'inode deve essere una operazione atomica (cioè non interrompibile da
151 altri) processi, per questo entrambe queste funzioni sono realizzate tramite
152 una singola system call.
154 Si ricordi infine che il file non viene eliminato dal disco fintanto che tutti
155 i riferimenti ad esso sono stati cancellati, solo quando il \textit{link
156 count} mantenuto nell'inode diventa zero lo spazio occupato viene rimosso. A
157 questo però si aggiunge una altra condizione, e cioè che non ci siano processi
158 che abbiano detto file aperto. Come accennato questa proprietà viene spesso
159 usata per essere sicuri di non lasciare file temporanei su disco in caso di
160 crash dei programmi; la tecnica è quella di aprire il file e chiamare
161 \texttt{unlink} subito dopo.
163 \subsection{Le funzioni \texttt{remove} e \texttt{rename}}
164 \label{sec:fileintr_remove}
166 Al contrario di quanto avviene con altri unix in Linux non è possibile usare
167 \texttt{unlink} sulle directory, per cancellare una directory si può usare la
168 funzione \texttt{rmdir} (vedi \secref{sec:filedir_dir_creat_rem}), oppure la
169 funzione \texttt{remove}. Questa è la funzione prevista dallo standard ANSI C
170 per cancellare un file o una directory (e funziona anche per i sistemi che non
171 supportano i link diretti), che per i file è identica alla \texttt{unlink} e
172 per le directory è identica alla \texttt{rmdir}:
174 \begin{prototype}{stdio.h}{int remove(const char *pathname)}
175 Cancella un nome dal filesystem. Usa \texttt{unlink} per i file e
176 \texttt{rmdir} per le directory.
178 La funzione restituisce zero in caso di successo e -1 per un errore, nel
179 qual caso il file non viene toccato. Per i codici di errori vedi quanto
180 riportato nella descrizione di \texttt{unlink} e \texttt{rmdir}.
183 Per cambiare nome ad un file si usa invece la funzione \texttt{rename}, il
184 vantaggio nell'uso di questa funzione al posto della chiamata successiva di
185 \texttt{unlink} e \texttt{link} è che l'operazione è eseguita atomicamente, in
186 questo modo non c'è la possibilità che un processo che cerchi di accedere al
187 nuovo nome dopo che il vecchio è stato cambiato lo trovi mancante.
189 \begin{prototype}{stdio.h}
190 {int rename(const char *oldpath, const char *newpath)}
191 Rinomina un file, spostandolo fra directory diverse quando richiesto.
193 La funzione restituisce zero in caso di successo e -1 per un errore, nel
194 qual caso il file non viene toccato. La variabile \texttt{errno} viene
195 settata secondo i seguenti codici di errore:
197 \item \texttt{EISDIR} \texttt{newpath} è una directory già esistente mentre
198 \texttt{oldpath} non è una directory.
199 \item \texttt{EXDEV} \texttt{oldpath} e \texttt{newpath} non sono sullo
201 \item \texttt{ENOTEMPTY} \texttt{newpath} è una directory già esistente e
203 \item \texttt{EBUSY} o \texttt{oldpath} o \texttt{newpath} sono in uso da
204 parte di qualche processo (come directory di lavoro o come root) o del
205 sistema (come mount point).
206 \item \texttt{EINVAL} \texttt{newpath} contiene un prefisso di
207 \texttt{oldpath} o più in generale si è cercato di creare una directory
208 come sottodirectory di se stessa.
209 \item \texttt{EMLINK} \texttt{oldpath} ha già il massimo numero di link
210 consentiti o è una directory e la directory che contiene \texttt{newpath}
211 ha già il massimo numero di link.
212 \item \texttt{ENOTDIR} Uno dei componenti dei pathname non è una directory
213 o\texttt{oldpath} è una directory e \texttt{newpath} esiste e non è una
215 \item \texttt{EFAULT} o \texttt{oldpath} o \texttt{newpath} è fuori dello
216 spazio di indirizzi del processo.
217 \item \texttt{EACCESS} Non c'è il permesso di scrittura per la directory in
218 cui si vuole creare il nuovo link o una delle directory del pathname non
219 consente la ricerca (permesso di esecuzione).
220 \item \texttt{EPERM} le directory contenenti \texttt{oldpath} o
221 \texttt{newpath} hanno lo sticky bit attivo e i permessi del processo non
222 consentono rispettivamente la cancellazione e la creazione del file, o il
223 filesystem non supporta i link.
224 \item \texttt{ENAMETOOLONG} uno dei pathname è troppo lungo.
225 \item \texttt{ENOENT} Uno dei componenti del pathname non esiste o è un link
227 \item \texttt{ENOMEM} il kernel non ha a disposizione memoria sufficiente a
228 completare l'operazione.
229 \item \texttt{EROFS} I file sono su un filesystem montato in sola lettura.
230 \item \texttt{ELOOP} Ci sono troppi link simbolici nella risoluzione del
232 \item \texttt{ENOSPC} Il device di destinazione non ha più spazio per la
237 \subsection{I link simbolici}
238 \label{sec:fileintr_symlink}
240 Siccome la funzione \texttt{link} crea riferimenti agli inodes, essa può
241 funzionare soltanto per file che risiedono sullo stesso filesystem, dato che
242 in questo caso è garantita l'unicità dell'inode, e solo per un filesystem di
243 tipo unix. Inoltre in Linux non è consentito eseguire un link diretto ad una
246 Per ovviare a queste limitazioni i sistemi unix supportano un'altra forma di
247 link (i cosiddetti \textit{soft link} o \textit{symbolic link}), che sono,
248 come avviene in altri sistemi operativi, dei file che contengono il
249 semplicemente il riferimento ad un altro file (o directory). In questo modo è
250 possibile effettuare link anche attraverso filesystem diversi e a directory, e
251 pure a file che non esistono ancora.
253 Il sistema funziona in quanto i link simbolici sono contrassegnati come tali
254 al kernel (analogamente a quanto avviene per le directory) per cui la chiamata
255 ad una \texttt{open} o una \texttt{stat} su un link simbolico comporta la
256 lettura del contenuto del medesimo e l'applicazione della funzione al file
257 specificato da quest'ultimo. Invece altre funzioni come quelle per cancellare
258 o rinominare i file operano direttamente sul link simbolico. Inoltre esistono
259 funzioni apposite, come la \texttt{readlink} e la \texttt{lstat} per accedere
260 alle informazioni del link invece che a quelle del file a cui esso fa
263 Le funzioni per operare sui link simbolici sono le seguenti, esse sono tutte
264 dichiarate nell'header file \texttt{unistd.h}.
266 \begin{prototype}{unistd.h}
267 {int symlink(const char * oldname, const char * newname)}
268 Crea un nuovo link simbolico al file indicato da \texttt{oldname} dandogli
269 nome \texttt{newname}.
271 La funzione restituisce zero in caso di successo e -1 per un errore, in caso
272 di errore. La variabile \texttt{errno} viene settata secondo i codici di
273 errore standard di accesso ai files (trattati in dettaglio in
274 \secref{sec:filedir_access_control}) ai quali si aggiungono i seguenti:
276 \item \texttt{EEXIST} Un file (o una directory) con quel nome esiste di
278 \item \texttt{EROFS} La directory su cui si vuole inserire il nuovo link è
279 su un filesystem montato readonly.
280 \item \texttt{ENOSPC} La directory o il filesystem in cui si vuole creare il
281 link è piena e non c'è ulteriore spazio disponibile.
282 \item \texttt{ELOOP} Ci sono troppi link simbolici nella risoluzione di
283 \texttt{oldname} o di \texttt{newname}.
287 Dato che la funzione \texttt{open} segue i link simbolici, è necessaria usare
288 un'altra funzione quando si vuole leggere il contenuto di un link simbolico,
289 questa funzione è la:
291 \begin{prototype}{unistd.h}
292 {int readlink(const char * path, char * buff, size\_t size)}
293 Legge il contenuto del link simbolico indicato da \texttt{path} nel buffer
294 \texttt{buff} di dimensione \texttt{size}. Non chiude la stringa con un
295 carattere nullo e la tronca a \texttt{size} nel caso il buffer sia troppo
296 piccolo per contenerla.
298 La funzione restituisce il numero di caratteri letti dentro \texttt{buff} o
299 -1 per un errore, in caso di errore. La variabile \texttt{errno} viene
300 settata secondo i codici di errore:
302 \item \texttt{EEXIST} Un file (o una directory) con quel nome esiste di
304 \item \texttt{EROFS} La directory su cui si vuole inserire il nuovo link è
305 su un filesystem montato readonly.
306 \item \texttt{ENOSPC} La directory o il filesystem in cui si vuole creare il
307 link è piena e non c'è ulteriore spazio disponibile.
308 \item \texttt{ELOOP} Ci sono troppi link simbolici nella risoluzione di
309 \texttt{oldname} o di \texttt{newname}.
313 \subsection{Le funzioni \texttt{mkdir} e \texttt{rmdir}}
314 \label{sec:filedir_dir_creat_rem}
316 Per creare una nuova directory si può usare la seguente funzione, omonima
317 dell'analogo comando di shell \texttt{mkdir}; per accedere ai tipi usati
318 programma deve includere il file \texttt{sys/types.h}.
320 \begin{prototype}{sys/stat.h}
321 {int mkdir (const char * dirname, mode\_t mode)}
322 Questa funzione crea una nuova directory vuota con il nome indicato da
323 \texttt{dirname}, assegnandole i permessi indicati da \texttt{mode}. Il nome
324 può essere indicato con il pathname assoluto o relativo.
326 La funzione restituisce zero in caso di successo e -1 per un errore, in caso
327 di errore \texttt{errno} viene settata secondo i codici di errore standard
328 di accesso ai files (trattati in dettaglio in
329 \secref{sec:filedir_access_control}) ai quali si aggiungono i seguenti:
331 \item \texttt{EACCESS}
332 Non c'è il permesso di scrittura per la directory in cui si vuole inserire
334 \item \texttt{EEXIST} Un file (o una directory) con quel nome esiste di già.
335 \item \texttt{EMLINK} La directory in cui si vuole creare la nuova directory
336 contiene troppi file. Sotto Linux questo normalmente non avviene perché il
337 filesystem standard consente la creazione di un numero di file maggiore di
338 quelli che possono essere contenuti nell'hard-disk, ma potendo avere a che
339 fare anche con filesystem di altri sistemi questo errore può presentarsi.
340 \item \texttt{ENOSPC} Non c'è abbastanza spazio sul file system per creare
342 \item \texttt{EROFS} La directory su cui si vuole inserire la nuova
343 directory è su un filesystem montato readonly.
348 \subsection{Accesso alle directory}
349 \label{sec:filedir_dir_read}
351 Benché le directory siano oggetti del filesystem come tutti gli altri non ha
352 ovviamente senso aprirle come fossero dei file di dati. Può però essere utile
353 poterne leggere il contenuto ad esempio per fare la lista dei file che esse
354 contengono o ricerche sui medesimi.
356 Per accedere al contenuto delle directory si usano i cosiddetti
357 \textit{directory streams} (chiamati così per l'analogia con i file stream);
358 la funzione \texttt{opendir} apre uno di questi stream e la funzione
359 \texttt{readdir} legge il contenuto della directory, i cui elementi sono le
360 \textit{directory entries} (da distinguersi da quelle della cache di cui
361 parlavamo in \secref{sec:fileintr_vfs}) in una opportuna struttura
362 \texttt{struct dirent}.
365 \subsection{La directory di lavoro}
366 \label{sec:filedir_work_dir}
368 A ciascun processo è associato ad una directory nel filesystem che è chiamata
369 directory corrente o directory di lavoro (\textit{current working directory})
370 che è quella a cui si fa riferimento quando un filename è espresso in forma
371 relativa (relativa appunto a questa directory).
373 Quando un utente effettua il login questa directory viene settata alla
374 cosiddetta \textit{home directory} del suo account, il comando \texttt{cd}
375 della shell consente di cambiarla a piacere, spostandosi da una directory ad
376 un'altra. Siccome la directory corrente resta la stessa quando viene creato
377 un processo figlio, la directory corrente della shell diventa anche la
378 directory corrente di qualunque comando da essa lanciato.
380 Le funzioni qui descritte servono esaminare e cambiare la directory di lavoro
383 \begin{prototype}{unistd.h}{char * getcwd (char * buffer, size\_t size)}
384 Restituisce il filename completo della directory di lavoro corrente nella
385 stringa puntata da \texttt{buffer}, che deve essere precedentemente
386 allocata, per una dimensione massima di \texttt{size}. Si può anche
387 specificare un puntatore nullo come \textit{buffer}, nel qual caso la
388 stringa sarà allocata automaticamente per una dimensione pari a
389 \texttt{size} qualora questa sia diversa da zero, o della lunghezza esatta
390 del pathname altrimenti. In questo caso si deve ricordare di disallocare la
391 stringa una volta cessato il suo utilizzo.
393 La funzione restituisce il puntatore \texttt{buffer} se riesce,
394 \texttt{NULL} se fallisce, in quest'ultimo caso la variabile
395 \texttt{errno} è settata con i seguenti codici di errore:
397 \item \texttt{EINVAL} L'argomento \texttt{size} è zero e \texttt{buffer} non
399 \item \texttt{ERANGE} L'argomento \texttt{size} è più piccolo della
400 lunghezza del pathname.
401 \item \texttt{EACCESS} Manca il permesso di lettura o di ricerca su uno dei
402 componenti del pathname (cioè su una delle directory superiori alla
407 Di questa funzione esiste una versione \texttt{char * getwd(char * buffer)}
408 fatta per compatibilità all'indietro con BSD, che non consente di specificare
409 la dimensione del buffer; esso deve essere allocato in precedenza ed avere una
410 dimensione superiore a \texttt{PATH\_MAX} (di solito 256 bytes, vedi
411 \secref{sec:xxx_limits}; il problema è che in Linux non esiste una dimensione
412 superiore per un pathname, per cui non è detto che il buffer sia sufficiente a
413 contenere il nome del file, e questa è la ragione principale per cui questa
414 funzione è deprecata.
416 Una seconda funzione simile è \texttt{char * get\_current\_dir\_name(void)}
417 che è sostanzialmente equivalente ad una \texttt{getcwd(NULL, 0)}, con la sola
418 differenza che essa ritorna il valore della variabile di ambiente
419 \texttt{PWD}, che essendo costruita dalla shell può contenere anche dei
420 riferimenti simbolici.
422 Come già detto in unix anche le directory sono file, è possibile pertanto
423 riferirsi ad esse tramite il file descriptor dell'interfaccia a basso livello,
424 e non solo tramite il filename; per questo motivo ci sono due diverse funzioni
425 per cambiare directory di lavoro.
427 \begin{prototype}{unistd.h}{int chdir (const char * pathname)}
428 Come dice il nome (che significa \textit{change directory}) questa funzione
429 serve a cambiare la directory di lavoro a quella specificata dal pathname
430 contenuto nella stringa \texttt{pathname}.
433 \begin{prototype}{unistd.h}{int fchdir (int filedes)}
434 Analoga alla precedente, ma usa un file descriptor invece del pathname.
436 Entrambe le funzioni restituiscono zero in caso di successo e -1 per un
437 errore, in caso di errore \texttt{errno} viene settata secondo i codici di
438 errore standard di accesso ai files (trattati in dettaglio in
439 \secref{sec:filedir_access_control}) ai quali si aggiunge il codice
440 \texttt{ENOTDIR} nel caso il \texttt{filename} indichi un file che non sia
445 \section{La manipolazione delle caratteristiche dei files}
446 \label{sec:filedir_infos}
448 Come spiegato in \secref{sec:fileintr_filesystem} tutte le informazioni
449 generali relative alle caratteristiche di ciascun file sono mantenute
450 nell'inode. Vedremo in questa sezione come sia possibile accedervi usando la
451 funzione \texttt{stat} ed esamineremo alcune funzioni utilizzabili per
452 manipolare una parte di questa informazione. Tutto quello che invece riguarda
453 il meccanismo di controllo di accesso ad i file e le relative funzioni di
454 manipolazione sarà invece esaminanto in \secref{sec:filedir_access_control}.
457 \subsection{Le funzioni \texttt{stat}, \texttt{fstat} e \texttt{lstat}}
458 \label{sec:filedir_stat}
460 La lettura delle informazioni relative ai file è fatta attraverso la famiglia
461 delle funzioni \func{stat}, che è la funzione che il comando \cmd{ls} usa
462 per poter stampare tutti i dati dei files. I prototipi di queste funzioni sono
465 \headdecl{sys/types.h}
466 \headdecl{sys/stat.h}
469 \funcdecl{int stat(const char *file\_name, struct stat *buf)} Legge le
470 informazione del file specificato da \var{file\_name} e le inserisce in
473 \funcdecl{int lstat(const char *file\_name, struct stat *buf)} Identica a
474 \func{stat} eccetto che se il \var{file\_name} è un link simbolico vengono
475 lette le informazioni relativa ad esso e non al file a cui fa riferimento.
477 \funcdecl{int fstat(int filedes, struct stat *buf)} Identica a \func{stat}
478 eccetto che si usa con un file aperto, specificato tramite il suo file
479 descriptor \var{filedes}.
481 Le funzioni restituiscono zero in caso di successo e -1 per un errore, in
482 caso di errore \texttt{errno} viene settato ai valori:
484 \item \texttt{EACCESS} non c'è il permesso di accedere al file.
485 \item \texttt{ENOTDIR} una componente del pathname non è una directory.
486 \item \texttt{EMLOOP} ci sono troppi link simbolici nel pathname.
487 \item \texttt{EFAULT} i puntatori usati sono fuori dallo spazio di indirizzi
489 \item \texttt{ENOMEM} il kernel non ha a disposizione memoria sufficiente a
490 completare l'operazione.
491 \item \texttt{ENAMETOOLONG} il filename è troppo lungo.
495 La struttura \texttt{stat} è definita nell'header \texttt{sys/stat.h} e in
496 generale dipende dall'implementazione, la versione usata da Linux è mostrata
497 in \nfig, così come riportata dalla man page (in realtà la definizione
498 effettivamente usata nel kernel dipende dall'architettura e ha altri campi
499 riservati per estensioni come tempi più precisi, o per il padding dei campi).
504 \begin{minipage}[c]{15cm}
505 \begin{lstlisting}[]{}
507 dev_t st_dev; /* device */
508 ino_t st_ino; /* inode */
509 mode_t st_mode; /* protection */
510 nlink_t st_nlink; /* number of hard links */
511 uid_t st_uid; /* user ID of owner */
512 gid_t st_gid; /* group ID of owner */
513 dev_t st_rdev; /* device type (if inode device) */
514 off_t st_size; /* total size, in bytes */
515 unsigned long st_blksize; /* blocksize for filesystem I/O */
516 unsigned long st_blocks; /* number of blocks allocated */
517 time_t st_atime; /* time of last access */
518 time_t st_mtime; /* time of last modification */
519 time_t st_ctime; /* time of last change */
524 \caption{La struttura \texttt{stat} per la lettura delle informazioni dei
526 \label{fig:filedir_stat_struct}
529 Si noti come i vari membri della struttura siano specificati come tipi nativi
530 del sistema (di quelli definiti in \tabref{tab:xxx_sys_types}, e dichiarati in
531 \texttt{sys/types.h}).
534 \subsection{I tipi di file}
535 \label{sec:filedir_file_types}
537 Come riportato in \tabref{tab:fileintr_file_types} in Linux oltre ai file e
538 alle directory esistono vari altri oggetti che possono stare su un filesystem;
539 il tipo di file è ritornato dalla \texttt{stat} nel campo \texttt{st\_mode}.
541 Dato che il valore numerico può variare a seconda delle implementazioni lo
542 standard POSIX definisce un insieme di macro per verificare il tipo di files,
543 queste venfono usate anche da Linux che supporta pure le estensioni per link
544 simbolici e socket definite da BDS, l'elenco è riportato in \ntab:
548 \begin{tabular}[c]{|l|l|}
550 Macro & Tipo del file \\
553 \macro{S\_ISREG(m)} & file normale \\
554 \macro{S\_ISDIR(m)} & directory \\
555 \macro{S\_ISCHR(m)} & device a caraetteri \\
556 \macro{S\_ISBLK(m)} & device a blocchi\\
557 \macro{S\_ISFIFO(m)} & fifo \\
558 \macro{S\_ISLNK(m)} & link simbolico \\
559 \macro{S\_ISSOCK(m)} & socket \\
562 \caption{Macro per i tipi di file (definite in \texttt{sys/stat.h})}
563 \label{tab:filedir_file_type_macro}
566 Oltre a queste macro è possibile usare direttamente il valore di
567 \var{st\_mode} per ricavare il significato dei vari bit in esso memorizzati,
568 per questo sempre in \texttt{sys/stat.h} sono definiti i flag riportati in
573 \begin{tabular}[c]{|l|c|l|}
575 Flag & Valore & Significato \\
578 \macro{S\_IFMT} & 0170000 & bitmask for the file type bitfields \\
579 \macro{S\_IFSOCK} & 0140000 & socket \\
580 \macro{S\_IFLNK} & 0120000 & symbolic link \\
581 \macro{S\_IFREG} & 0100000 & regular file \\
582 \macro{S\_IFBLK} & 0060000 & block device \\
583 \macro{S\_IFDIR} & 0040000 & directory \\
584 \macro{S\_IFCHR} & 0020000 & character device \\
585 \macro{S\_IFIFO} & 0010000 & fifo \\
586 \macro{S\_ISUID} & 0004000 & set UID bit \\
587 \macro{S\_ISGID} & 0002000 & set GID bit (see below) \\
588 \macro{S\_ISVTX} & 0001000 & sticky bit (see below) \\
589 \macro{S\_IRWXU} & 00700 & mask for file owner permissions \\
590 \macro{S\_IRUSR} & 00400 & owner has read permission \\
591 \macro{S\_IWUSR} & 00200 & owner has write permission \\
592 \macro{S\_IXUSR} & 00100 & owner has execute permission \\
593 \macro{S\_IRWXG} & 00070 & mask for group permissions \\
594 \macro{S\_IRGRP} & 00040 & group has read permission \\
595 \macro{S\_IWGRP} & 00020 & group has write permission \\
596 \macro{S\_IXGRP} & 00010 & group has execute permission \\
597 \macro{S\_IRWXO} & 00007 & mask for permissions for others (not in
599 \macro{S\_IROTH} & 00004 & others have read permission \\
600 \macro{S\_IWOTH} & 00002 & others have write permisson \\
601 \macro{S\_IXOTH} & 00001 & others have execute permission \\
604 \caption{Flag per il campo \var{st\_mode} (definite in
605 \texttt{sys/stat.h})}
606 \label{tab:filedir_file_mode_flags}
609 Il primo valore definisce la maschera dei bit usati nei quali viene
610 memorizzato il tipo di files, mentre gli altri possono essere usati per
611 effettuare delle selezioni sul tipo di file voluto.
613 \subsection{La dimensione dei file}
614 \label{sec:filedir_file_size}
616 Il membro \var{st\_size} contiene la dimensione del file in bytes (se il file
617 è un file normale, nel caso di un link simbolico al dimensione è quella del
618 pathname che contiene, per le directory è in genere un multiplo di 512).
620 Il campo \var{st\_blocks} definisce la lunghezza del file in blocchi di 512
621 bytes. Il campo \var{st\_blksize} infine definisce la dimensione preferita per
622 i trasferimenti sui file (che è la dimensione usata anche dalle librerie del C
623 per l'interfaccia deglli stream); scrivere in blocchi di dimensione inferiore
624 sarebbe inefficiente.
626 Si tenga conto che lunghezza del file riportata in \var{st\_size} non è detto
627 che corrisponda all'occupazione dello spazio su disco per via della possibile
628 esistenza dei cosiddetti \textsl{buchi} (detti normalmente \textit{holes}) che
629 si formano tutte le volte che si va a scrivere su un file dopo aver eseguito
630 una \func{seek} (vedi \secref{sec:fileunix_lseek}) oltre la sua conclusione
633 In tal caso si avranno differenti risultati a seconda del modi in cui si
634 calcola la lunghezza del file, ad esempio il comando \cmd{du}, (che riporta il
635 numero di blocchi occupati) potrà dare una dimensione inferiore, mentre se si
636 legge dal file (ad esempio usando \cmd{wc -c}), dato che in tal caso per le
637 parti non scritte vengono restituiti degli zeri, si avrà lo stesso risultato
641 Se è sempre possibile allargare un file scrivendoci sopra od usando la
642 funzione \func{seek} per spostarsi oltre la sua fine. Esistono però anche casi
643 in cui si può avere bisogno di effettuare un troncamento scartando i dati al
644 di là della dimensione scelta come nuova fine del file.
646 Un file può essere troncato a zero aprendolo con il flag \macro{O\_TRUNC}, ma
647 questo è un caso particolare; per qualunque altra dimensione si possono usare
650 \headdecl{unistd.h} \funcdecl{int truncate(const char *file\_name, off_t
651 length)} Fa si che la dimensione del file \var{file\_name} sia troncata ad
652 un valore massimo specificato da \var{lenght}.
654 \funcdecl{int ftruncate(int fd, off_t length))} Identica a \func{truncate}
655 eccetto che si usa con un file aperto, specificato tramite il suo file
658 Le funzioni restituiscono zero in caso di successo e -1 per un errore, in
659 caso di errore \texttt{errno} viene settato ai valori:
661 \item \texttt{EACCESS} non c'è il permesso di accedere al file.
662 \item \texttt{ENOTDIR} una componente del pathname non è una directory.
663 \item \texttt{EMLOOP} ci sono troppi link simbolici nel pathname.
664 \item \texttt{EFAULT} i puntatori usati sono fuori dallo spazio di indirizzi
666 \item \texttt{ENOMEM} il kernel non ha a disposizione memoria sufficiente a
667 completare l'operazione.
668 \item \texttt{ENOENT} il file non esiste.
669 \item \texttt{ENAMETOOLONG} il filename è troppo lungo.
673 Se il file è più lungo della lunghezza specificata i dati in eccesso saranno
674 perduti; il comportamento in caso di lunghezza inferiore non è specificato e
675 dipende dall'implementazione, il file può essere lasciato invariato o esteso
676 fino alla lunghezza scelta; in quest'ultimo caso lo spazio viene riempito con
677 zeri (e in genere si ha la creazione di un hole nel file).
679 \subsection{I tempi dei file}
680 \label{sec:filedir_file_times}
682 Il sistema mantiene tre tempi per ciascun file, corrispondenti a tre campi
683 della struttura \func{stat}, come riassunto in \ntab:
687 \begin{tabular}[c]{|c|l|l|c|}
688 \var{st\_atime} & & & \\
689 \var{st\_mtime} & & & \\
690 \var{st\_ctime} & & & \\
692 \caption{I tre tempi associati a ciascun file}
693 \label{tab:filedir_file_times}
697 \subsection{La funzione \texttt{utime}}
698 \label{sec:filedir_utime}
703 \section{Il controllo di accesso ai file}
704 \label{sec:filedir_access_control}
707 In unix è implementata da qualunque filesystem standard una forma elementare
708 (ma adatta alla maggior parte delle esigenze) di controllo di accesso ai
709 files. Torneremo sull'argomento in dettaglio più avanti (vedi
710 \secref{sec:filedir_access_control}), qui ci limitiamo ad una introduzione dei
713 Si tenga conto poi che quanto diremo è vero solo per filesystem di tipo Unix,
714 e non è detto che sia applicabile (ed infatti non è vero per il filesystem di
715 Windows) a un filesystem qualunque. Esistono inoltre estensioni che permettono
716 di implementare le ACL (\textit{Access Control List}) che sono un meccanismo
717 di controllo di accesso molto più sofisticato.
719 Ad ogni file Unix associa sempre l'utente che ne è proprietario (il cosiddetto
720 \textit{owner}) e il gruppo di appartenenza, secondo il meccanismo degli uid e
721 gid accennato in \secref{sec:intro_multiuser}, e un insieme di permessi che
722 sono divisi in tre classi, e cioè attribuiti rispettivamente al proprietario,
723 a qualunque utente faccia parte del gruppo cui appartiene il file, e a tutti
726 I permessi sono espressi da un insieme di 12 bit: di questi i nove meno
727 significativi sono usati a gruppi di tre per indicare i permessi base di
728 lettura, scrittura ed esecuzione (indicati rispettivamente con le lettere
729 \textit{w}, \textit{r} \textit{x}) applicabili rispettivamente al
730 proprietario, al gruppo, a tutti (una descrizione più dettagliata dei vari
731 permessi associati ai file è riportata in \secref{sec:filedir_suid_sgid}). I
732 restanti tre bit sono usati per indicare alcune caratteristiche più complesse
733 (\textit{suid}, \textit{sgid}, e \textit{sticky}) su cui pure torneremo in
734 seguito (vedi \secref{sec:filedir_suid_sgid} e \secref{sec:filedir_sticky}).
736 Tutte queste informazioni sono tenute per ciascun file nell'inode. Quando un
737 processo cerca l'accesso al file esso controlla i propri uid e gid
738 confrontandoli con quelli del file e se l'operazione richiesta è compatibile
739 con i permessi associati al file essa viene eseguita, altrimenti viene
740 bloccata ed è restituito un errore di \texttt{EPERM}. Questo procedimento non
741 viene eseguito per l'amministratore di sistema (il cui uid è zero) il quale ha
742 pertanto accesso senza restrizione a qualunque file del sistema.
744 % In realtà il procedimento è più complesso di quanto descritto in maniera
745 % elementare qui; inoltre ad un processo sono associati diversi identificatori,
746 % torneremo su questo in maggiori dettagli in seguito in \secref{sec:proc_perms}.
750 \subsection{I flag \texttt{suid} e \texttt{sgid}}
751 \label{sec:filedir_suid_sgid}
758 \subsection{La titolarità di nuovi files e directory}
759 \label{sec:filedir_ownership}
761 \subsection{La funzione \texttt{access}}
762 \label{sec:filedir_access}
764 \subsection{La funzione \texttt{umask}}
765 \label{sec:filedir_umask}
767 \subsection{Le funzioni \texttt{chmod} e \texttt{fchmod}}
768 \label{sec:filedir_chmod}
770 \subsection{Il flag \texttt{sticky}}
771 \label{sec:filedir_sticky}
773 \subsection{Le funzioni \texttt{chown}, \texttt{fchown} e \texttt{lchown}}
774 \label{sec:filedir_chown}
779 %La struttura fondamentale che contiene i dati essenziali relativi ai file è il
780 %cosiddetto \textit{inode}; questo conterrà informazioni come il
781 %tipo di file (file di dispositivo, directory, file di dati, per un elenco
782 %completo vedi \ntab), i permessi (vedi \secref{sec:file_perms}), le date (vedi
783 %\secref{sec:file_times}).