Spostata roba su socket TCP in un nuovo file (nuovo capitolo)
[gapil.git] / files.tex
1 \chapter{I files: introduzione}
2 \label{cha:files}
3  
4 Uno dei concetti fondamentali del design di unix è il cosiddetto
5 \textit{everything is a file}, cioè il fatto che l'accesso ai vari dispositivi
6 di I/O del computer viene effettuato attraverso un'interfaccia astratta che
7 tratta le periferiche allo stesso modo degli usuali file di dati.
8
9 Si può accedere cioè a qualunque periferica del computer, dalla seriale, alla
10 parallela, alla console, e agli stessi dischi, (unica eccezione le interfacce
11 di rete, che che non rientrano bene nell'astrazione) attraverso i cosiddetti
12 file di dispositivo (i \textit{device files}). Questi sono dei file speciali
13 agendo sui quali i programmi possono leggere, scrivere e compiere operazioni
14 sulle perferiche, usando le stesse funzioni che si usano per i normali file di
15 dati.
16
17 \section{Concetti generali riguardanti i files}
18 \label{sec:file_gen}
19
20 Visto il ruolo fondamentale che i files vengono ad assumere in un sistema
21 unix, è anzitutto opportuno fornire un'introduzione dettagliata su come essi
22 vengono trattati dal sistema. In particolare occorre tenere presente dov'è che
23 si situa il limite fondamentale fra kernel space e user space che tracciavamo
24 al Cap.~\ref{cha:intro_unix}.
25
26 Partiamo allora da come viene strutturata nel sistema la disposizione dei
27 file: per potervi accedere il kernel usa una apposita interfaccia che permetta
28 di strutturare l'informazione tenuta sullo spazio grezzo disponibile sui
29 dischi, cioè quello che si chiama un \textit{filesystem}. 
30
31 Sarà attraverso quest'ultimo che il kernel andrà a gestire l'accesso ai dati
32 memorizzati all'interno del disco stesso, strutturando l'informazione in files
33 e directory.  Per poter accedere ai file contenuti in un disco occorrerà
34 perciò attivare il filesystem, questo viene fatto \textsl{montando} il disco
35 (o la partizione del disco).
36
37 %In generale un filesystem piazzerà opportunamente sul disco dei blocchi di
38 %informazioni riservate che tengono conto degli inodes allocati, di quelli
39 %liberi, e delle posizioni fisiche su disco dei dati contenuti nei files, per
40
41 In Unix, a differenza di quanto avviene in altri sistemi operativi, tutti i
42 file vengono tenuti all'interno di un unico albero la cui radice (la directory
43 di \textit{root}) viene montata all'avvio. Pertanto un file viene identificato
44 dall'utente usando quello che viene chiamato \textit{pathname}, cioè il
45 percorso completo che si deve fare a partire dalla radice, per accedere al
46 file.
47
48 Dopo la fase di inizializzazione il kernel riceve dal boot loader
49 l'indicazione di quale dispositivo contiene il filesystem da usare come punto
50 di partenza e questo viene montato come radice dell'albero (cioè nella
51 directory \texttt{/}); tutti gli ulteriori dischi devono poi essere inseriti
52 nell'albero utilizzando opportune subdirectory.
53
54 Alcuni filesystem speciali (come \texttt{/proc} che contiene un'interfaccia ad
55 alcune strutture interne del kernel) sono generati automaticamente dal kernel
56 stesso, ma anche essi devono essere montati all'interno dell'albero.
57
58 All'interno dello stesso albero si potranno poi inserire anche gli altri
59 oggetti visti attraverso l'interfaccia che manipola i files come le FIFO, i
60 link, i socket e gli stessi i file di dispositivo (questi ultimi, per
61 convenzione, sono inseriti nella directory \texttt{/dev}).
62
63 \subsection{Il \textit{virtual filesystem} di linux}
64 \label{sec:file_vfs}
65
66 Esamineremo adesso come viene implementato l'accesso ai files in linux. Questa
67 sezione riporta informazioni sui dettagli di come il kernel gestisce i files,
68 ed è basata sul documento di Richard Goochs distribuito coi sorgenti del
69 kernel (\texttt{linux/Documentation/vfs.txt}).
70
71 L'argomento è abbastanza ``esoterico'' e questa sezione può essere saltata ad
72 una prima lettura; è bene però tenere presente che vengono introdotti qui
73 alcuni termini che potranno comparire in seguito, come \textit{inode},
74 \textit{dentry}, \textit{dcache}.
75
76 In linux il concetto di \textit{everything is a file} è stato implementato
77 attraverso il \textit{virtual filesystem} (da qui in avanti VFS) che è
78 l'interfaccia astratta che il kernel rende disponibile ai programmi in user
79 space attraverso la quale vengono manipolati i files, esso provvede anche
80 un'astrazione delle operazioni di manipolazione sui files che permette la
81 coesistenza di diversi filesystem all'interno dello stesso kernel.
82
83 La funzione più importante implementata dal VFS è la system call \texttt{open}
84 che permette di aprire un file. Dato un pathname viene eseguita una ricerca
85 dentro la \textit{directory entry cache} (in breve \textit{dcache}) che è
86 una tabella di hash che contiene tutte le \textit{directory entry} (in breve
87 \textit{dentry}) che permette di associare in maniera rapida ed efficiente il
88 pathname a una specifica dentry.
89
90 Una singola dentry contiene in genere il puntatore ad un \textit{inode};
91 quest'ultimo è la struttura base che sta sul disco e che identifica un singolo
92 oggetto del VFS sia esso un file ordinario, una directory, una FIFO, un file
93 di dispositivo, o una qualsiasi altra cosa che possa essere rappresentata dal
94 VFS (sui tipi di ``files'' possibili torneremo in seguito).
95
96 Le dentries ``vivono'' in memoria e non vengono mai salvate su disco, vengono
97 usate per motivi di velocità, gli inodes invece stanno su disco e vengono
98 copiati in memoria quando serve, ed ogni cambiamento viene copiato
99 all'indietro sul disco, gli inodes che stanno in memoria sono inodes del VFS
100 ed è ad essi che puntano le singole dentry.
101
102 La dcache costituisce perciò una sorta di vista completa di tutto l'albero dei
103 files, ovviamente per non riempire tutta la memoria questa vista è parziale
104 (la dcache cioè contiene solo le dentry per i file per i quali è stato
105 richiesto l'accesso), quando si vuole risolvere un nuovo pathname il VFS deve
106 creare una nuova dentry e caricare l'inode corrispondente in memoria. 
107
108 Questo procedimento viene eseguito dalla metodo \texttt{lookup()} dell'inode
109 della directory che contiene il file; esso viene installato dallo specifico
110 filesystem su cui l'inode va a vivere.
111
112 Una volta che il VFS ha a disposizione la dentry (ed il relativo inode)
113 diventa possibile accedere a operazioni sul file come la \texttt{open} per
114 aprire il file o la \texttt{stat} per leggere i dati dell'inode e passarli in
115 user space.
116
117 L'apertura di un file richiede comunque un'altra operazione, l'allocazione di
118 una struttura di tipo \texttt{file} in cui viene inserito un puntatore alla
119 dentry e una struttura \verb|f_ops| che contiene i puntatori ai metodi che
120 implementano le operazioni disponibili sul file. In questo modo i processi in
121 user space possono accedere alle operazioni attraverso detti metodi, che
122 saranno diversi a seconda del tipo di file (o dispositivo) aperto. Un elenco
123 delle operazioni disponibili è riportato in \ntab.
124
125 \begin{table}[htb]
126   \centering
127   \begin{tabular}[c]{c p{7cm}}
128     \textbf{funzione} & \textbf{operazione} \\
129     \hline
130     \textit{open}    & apre il file \\
131     \textit{read}    & legge dal file \\
132     \textit{write}   & scrive sul file \\ 
133     \textit{llseek}  & sposta la posizione corrente sul file \\
134     \textit{ioctl}   & accede alle operazioni di controllo 
135                        (tramite la \texttt{ioctl})\\
136     \textit{readdir} & per leggere il contenuto di una directory \\
137     \textit{poll}    & \\
138     \textit{mmap}    & chiamata dalla system call \texttt{mmap}. 
139                        mappa il file in memoria\\
140     \textit{release} & chiamata quando l'ultima referenza a un file 
141                        aperto è chiusa\\
142     \textit{fsync}   & chiamata dalla system call \texttt{fsync} \\
143     \textit{fasync}  & chiamate da \texttt{fcntl} quando è abilitato 
144                        il modo asincrono per l'I/O su file. \\
145     \hline
146   \end{tabular}
147   \caption{Operazioni sui file definite nel VFS.}
148   \label{tab:file_operations}
149 \end{table}
150
151 In questo modo per ciascun file diventano utilizzabili una serie di operazioni
152 (non è dette che tutte siano disponibili), che costituiscono l'interfaccia
153 astratta del VFS, e qualora se ne voglia eseguire una il kernel andrà ad
154 utilizzare la opportuna routine dichiarata in \verb|f_ops| appropriata al tipo
155 di file in questione. 
156
157 Così sarà possibile scrivere sulla porta seriale come su un file di dati
158 normale; ovviamente certe operazioni (nel caso della seriale ad esempio la
159 \textit{seek}) non saranno disponibili, però con questo sistema l'utilizzo di
160 diversi filesystem (come quelli usati da Windows o MacOs) è immediato e
161 (relativamente) trasparente per l'utente ed il programmatore.
162
163 \subsection{Proprietari e permessi}
164 \label{sec:file_perms}
165
166 In Unix è implementata da qualunque filesystem standard una forma elementare
167 (ma adatta alla maggior parte delle esigenze) di controllo di accesso ai
168 files. Torneremo sull'argomento in dettaglio più avanti, qui ci limitiamo ad
169 una introduzione dei concetti essenziali.
170
171 Si tenga conto poi che quanto diremo è vero solo per filesystem di tipo Unix,
172 e non è detto che sia applicabile (ed infatti non è vero per il filesystem di
173 Windows) a un filesystem qualunque. Esistono inoltre estensioni che permettono
174 di implementare le ACL (\textit{Access Control List}) che sono un meccanismo
175 di controllo di accesso molto più sofisticato.
176
177 Ad ogni file Unix associa sempre l'utente che ne è proprietario (il cosiddetto
178 \textit{owner}) e il gruppo di appartenenza, secondo il meccanismo degli uid e
179 gid spiegato in \ref{sec:intro_usergroup}, e un insieme di permessi che sono
180 divisi in tre classi, e cioè attribuiti rispettivamente al proprietario, a
181 qualunque utente faccia parte del gruppo cui appartiene il file, e a tutti gli
182 altri utenti.
183
184 I permessi sono espressi da un insieme di 12 bit: di questi i nove meno
185 significativi sono usati a gruppi di tre per indicare i permessi base di
186 lettura, scrittura ed esecuzione (indicati rispettivamente con le lettere
187 \textit{w}, \textit{r} \textit{x}) applicabili rispettivamente al
188 proprietario, al gruppo, a tutti. I restanti tre bit sono usati per indicare
189 alcune caratteristiche più complesse (\textit{suid}, \textit{sgid}, e
190 \textit{sticky}) su cui torneremo in seguito.
191
192 Tutte queste informazioni sono tenute per ciascun file nell'inode. Quando un
193 processo cerca l'accesso al file esso controlla i propri uid e gid
194 confrontandoli con quelli del file e se l'operazione richiesta è compatibile
195 con i permessi associati al file essa viene eseguita, altrimenti viene
196 bloccata ed è restituito un errore di \texttt{EPERM}. Questo procedimento non
197 viene eseguito per l'amministratore di sistema (il cui uid è zero) il quale ha
198 pertanto accesso senza restrizione a qualunque file del sistema.
199
200 In realtà il procedimento è più complesso di quanto descritto in maniera
201 elementare qui, in quanto ad un processo sono associati diversi
202 identificatori, torneremo su questo in maggiori dettagli in seguito in
203 \ref{sec:proc_perms}.
204
205 \subsection{I tipi di files}
206 \label{sec:file_types}
207
208 Come detto in precedenza esistono vari tipi di oggetti implementati del VFS
209 per i quali è disponibile l'interfaccia astratta da esso provveduta. Un elenco
210 dei vari tipi di file è il seguente:
211  
212 \begin{table}[htb]
213   \begin{center}
214     \begin{tabular}[c]{l l p{7cm}}
215     \multicolumn{2}{c}{\textbf{Nome}} & \textbf{Descrizione} \\
216     \hline
217       \textit{regular file} & \textsl{file normale} &
218       un file che contiene dei dati (l'accezione normale di file) \\
219       \textit{directory} & \textsl{cartella o direttorio} &
220       un file che contiene una lista di nomi associati a degli inodes \\
221       \textit{symbolic link} & \textsl{collegamento simbolico} &
222       un file che contiene un riferimento ad un altro file/directory \\
223       \textit{char device} & \textsl{dispositivo a caratteri} &
224       un file che identifica una periferica ad accesso sequenziale \\
225       \textit{block device} & \textsl{dispositivo a blocchi} &
226       un file che identifica una periferica ad accesso diretto \\
227       \textit{fifo} & \textsl{tubo} &
228       un file speciale che identifica una linea di comunicazione software
229       (unidirezionale) \\
230       \textit{socket} & \textsl{manicotto} &
231       un file speciale che identifica una linea di comunicazione software
232       (bidirezionale) \\
233     \hline
234     \end{tabular}
235     \caption{Tipologia dei file definiti nel VFS}
236     \label{tab:file_types}
237   \end{center}
238 \end{table}
239
240 Tutto ciò non ha ovviamente nulla a che fare con la classificazione sui tipi
241 di file (in questo caso file di dati) in base al loro contenuto, o tipo di
242 accesso.  Una delle differenze principali con altri sistemi operativi (come il
243 VMS o Windows) è che per Unix tutti i file di dati sono identici e contengono
244 un flusso continuo di bytes; non esiste cioè differenza per come vengono visti
245 dal sistema file di diverso contenuto o formato (come nel caso di quella fra
246 file di testo e binari che c'è in windows) né c'è una strutturazione a record
247 per il cosiddetto ``accesso diretto'' come nel caso del VMS.
248
249 Una seconda differenza è nel formato dei file ascii; in Unix la fine riga è
250 codificata in maniera diversa da Windows o MacIntosh, in particolare il fine
251 riga è il carattere \texttt{LF} (o \verb|\n|) al posto del \texttt{CR}
252 (\verb|\r|) del mac e del \texttt{CR LF} di windows. Questo può causare alcuni
253 problemi qualora si facciano assunzioni sul terminatore della riga.
254
255
256 \section{Una panoramica sull'uso dei file}
257 \label{sec:file_io_base}
258
259 Per poter accedere al contenuto dei file occorre anzitutto aprirlo. Questo
260 crea un canale di comunicazione che permette di eseguire una serie di
261 operazioni. Una volta terminate le operazioni, il file dovrà essere chiuso, e
262 questo chiuderà il canale di comunicazione impedendo ogni ulteriore
263 operazione.
264
265
266 \subsection{Le due interfacce ai file}
267 \label{sec:file_base_api}
268
269 In unix le modalità di accesso ai file e le relative interfacce di
270 programmazione sono due, basate su due diversi meccanismi di connessione. 
271
272 La prima è quella dei cosiddetti \textit{file descriptor} (descrittore di
273 file), che è specifica di Unix e che provvede un accesso diretto a basso
274 livello non bufferizzato, con un'interfaccia primitiva ed essenziale; i file
275 descriptors sono rappresentati da numeri interi (cioè semplici variabili di
276 tipo \texttt{int}). L'interfaccia è definita nell'header \texttt{unistd.h}.
277
278 La seconda è quella degli \textit{stream}, che provvede un'interfaccia più
279 evoluta e un accesso bufferizzato. Questa è anche l'interfaccia standard usata
280 dal linguaggio C e perciò si trova anche su tutti i sistemi non Unix. Gli
281 stream sono oggetti complessi e sono rappresentati da puntatori ad un
282 opportuna struttura definita dalle librerie del C, si accede ad essi sempre in
283 maniera indiretta utilizzando il tipo \texttt{FILE *}. L'interfaccia è
284 definita nell'header \texttt{stdio.h}.
285
286 Entrambe le interfacce possono essere usate per l'accesso ai file come agli
287 altri oggetti del VFS (pipes, socket, device), ma per poter accedere alle
288 operazioni di controllo sul particolare tipo di oggetto del VFS scelto occorre
289 usare l'interfaccia a basso livello dei file descriptor. Allo stesso modo
290 devono essere usati i file descriptor se si vuole ricorrere a modalità
291 speciali di I/O come il polling o il non-bloccante (vedi
292 \ref{sec:file_bohhhhh}).
293
294 Gli stream forniscono un'interfaccia di alto livello costruita sopra quella
295 dei file descriptor, che tratta tutti i file nello stesso modo, con
296 l'eccezione di poter scegliere tre diversi stili di bufferizzazione.  Il
297 maggior vantaggio degli stream è che l'interfaccia per le operazioni di
298 input/output è enormemente più ricca di quella dei file descriptor, che
299 provvedono solo funzioni elementari per la lettura/scrittura diretta di
300 blocchi di bytes.  In particolare gli stream dispongono di tutte le funzioni
301 di formattazione per l'input e l'output adatte per manipolare anche i dati in
302 forma di linee o singoli caratteri.
303
304 In ogni caso, dato che gli stream sono implementati sopra l'interfaccia a
305 basso livello dei file descriptor, è sempre possibile estrarre il file
306 descriptor da uno stream ed eseguirvi operazioni di basso livello, o associare
307 in un secondo tempo uno stream ad un file descriptor.
308
309 In generale, se non necessitano specificatamente le funzionalità di basso
310 livello, è opportuno usare sempre gli stream per la loro maggiore portabilità
311 essendo questi ultimi definito nello standard ISO C; l'interfaccia con i file
312 descriptor invece segue solo lo standard POSIX.1 dei sistemi unix ed è
313 pertanto di portabilità più limitata.
314
315 \subsection{Caratteristiche specifiche dei file in unix}
316 \label{sec:files_spec_unix}
317
318 Essendo un sistema multitasking e multiutente esistono alcune caratteristiche
319 specifiche di Unix che devono essere tenute in conto nell'accesso ai file. È
320 infatti normale che più processi o programmi possano accedere
321 contemporaneamente allo stesso file e devono poter eseguire le loro operazioni
322 indipendentemente da quello che fanno gli altri processi.
323
324 Per questo motivo le strutture usate per all'accesso ai file sono relative al
325 processo che effettua l'accesso.  All'apertura di ogni file infatti viene
326 creata all'interno del processo una apposita struttura in cui sono memorizzati
327 tutti gli attributi del medesimo, che viene utilizzata per tutte le
328 operazioni. Questa è una struttura che resta locale al processo stesso; in
329 questo modo processi diversi possono usare le proprie strutture locali per
330 accedere ai file (che può essere sempre lo stesso) in maniera assolutamente
331 indipendente.
332
333 Questo ha delle conseguenze di cui è bene tenere conto; ad esempio in tutti i
334 sistemi POSIX uno degli attributi di un file aperto è la posizione corrente nel
335 file, cioè il punto nel file in cui verrebbe letto o scritto alla operazione
336 successiva. Essa è rappresentata da un numero intero che indica il numero di
337 bytes dall'inizio del file, che viene (a meno che non si apra il file in
338 append) inizializzato a zero all'apertura del medesimo.
339
340 Questo è uno dei dati che viene mantenuto nella suddetta struttura, per cui
341 ogni processo avrà la sua posizione corrente nel file, che non sarà
342 influenzata da quello che altri processi possono fare. Anzi, aprire un file
343 significa appunto creare ed inizializzare una tale struttura, per cui se si
344 apre due volte lo stesso file all'interno dello stesso processo, si otterrano
345 due file descriptor o due stream che avranno ancora una posizione corrente nel
346 file assolutamente indipendente.
347
348 Si tenga conto inoltre che un'altro dei dati contenuti nella struttura di
349 accesso è un riferimento all'inode del file, pertanto anche se il file viene
350 cancellato da un altro processo, sarà sempre possibile mantenere l'accesso ai
351 dati, e lo spazio su disco non verrà rilasciato fintanto che il file non sarà
352 chiuso e l'ultimo riferimento cancellato. È pertanto possibile (e pratica
353 comune) aprire un file provvisorio per cancellarlo immediatamente dopo; in
354 questo modo all'uscita del programma il file scomparirà definitivamente dal
355 disco, ma il file ed il suo contenuto saranno disponibili per tutto il tempo
356 in cui il processo è attivo.
357
358
359 \subsection{L'accesso ai files: nomi e directory}
360 \label{sec:file_names}
361
362 L'organizzazione dei nomi dei file deriva direttamente dall'organizzazione dei
363 medesimi nella gerarchia di directory descritta in \ref{sec:file_base}; una
364 directory comunque, come già specificato in \ref{sec:file_vfs}, è solo un
365 particolare tipo di file che il sistema riconosce come tale, che contiene le
366 informazioni che associano un inode ad un nome. Per questo, anche se è usuale
367 parlare di ``file in una directory'' in realtà una directory contiene solo dei
368 riferimenti ai file, non i file stessi.
369
370 I nomi contenuti nelle directory sono chiamati componenti (\textit{file name
371   components}), un file può essere indicato rispetto alla directory corrente
372 semplicemente specificando il nome da essa contenuto. Una directory contiene
373 semplicemente un elenco di questi componenti, che possono corrispondere a un
374 qualunque oggetto del filesystem, compresa un'altra directory.
375
376 Un nome di file è composto da una serie di \textsl{componenti} separati da una
377 \texttt{/} (in linux più \texttt{/} consecutive sono considerate equivalenti
378 ad una sola). Il nome completo di un file viene usualmente chiamato
379 \textit{filename} o \textit{pathname}, anche se quest'ultimo può generare
380 confusione, dato che con \textit{path} si indica anche un insieme di directory
381 su cui effettuare una ricerca (ad esempio quello in cui si cercano i comandi).
382
383 Il processo con cui si associa ad un pathname uno specifico file (cioè si
384 identifica l'inode a cui fare riferimento) è chiamato risoluzione del nome
385 (\textit{file name resolution} o \textit{pathname resolution}).
386 La risoluzione viene fatta esaminando il pathname da destra a sinistra e
387 localizzando ogni componente nella directory indicata dal componente
388 precedente: ovviamente perché il procedimento funzioni occorre che i
389 componenti indicati come directory esistano e siano effettivamente directory,
390 inoltre i permessi devono consentire l'accesso.
391
392 Se il pathname comincia per \texttt{/} la ricerca parte dalla directory radice
393 del processo che (a meno di un \textit{chroot} su cui torneremo in seguito,
394 vedi \ref{sec:file_chroot}) è la stessa per tutti i processi ed equivale alla
395 radice dell'albero (\ref{sec:file_gen}): in questo caso si parla di un
396 pathname \textsl{assoluto}. Altrimenti la ricerca parte dalla directory
397 corrente (su cui pure torneremo più avanti in \ref{sec:file_dir_working}) ed
398 il pathname è detto \textsl{relativo}.
399
400 I componenti \texttt{.} e \texttt{..} hanno un significato speciale e vengono
401 inseriti in ogni directory, il primo fa riferimento alla directory corrente e
402 il secondo alla directory \textsl{genitore} (\textit{parent directory}) cioè
403 la directory che contiene il riferimento alla directory corrente; nel caso
404 questa sia la directory radice allora il riferimento è a se stessa.
405
406 Infine si ricordi che in Unix non esistono i tipi di file e che non c'è nessun
407 supporto per le estensioni come parte del filesystem. Ciò non ostante molti
408 programmi adottano delle convenzioni per i nomi dei file, ad esempio il codice
409 C normalmente si mette in file con l'estensione .c, ma questa è, appunto, solo
410 una convenzione.
411
412
413 \section{L'interfaccia al filesystem}
414 \label{sec:file_filesys_interf}
415
416 Prima di entrare nei dettagli della manipolazione del contenuto dei file
417 esamineremo le funzioni utilizzate per operare sui file piuttosto che sul loro
418 contenuto. Le funzioni che esamineremo in questa sezione pertanto sono quelle
419 che permettono di esaminare e modificare le directory, rinominare o cancellare
420 i file, esaminare o settare i loro attributi.
421
422 \subsection{La directory di lavoro}
423 \label{sec:file_dir_working}
424
425 Come accennato ciascun processo è associato ad una directory nel filesystem
426 che è chiamata directory corrente o directory di lavoro (\textit{current
427   working directory}) che è quella a cui si fa riferimento quando un filename
428 è espresso in forma relativa (relativa appunto a questa directory).
429
430 Quando un utente effettua il login questa directory viene settata alla
431 cosiddetta \textit{home directory} del suo account, il comando \texttt{cd}
432 della shell consente di cambiarla a piacere, spostandosi da una directory ad
433 un'altra.  Siccome la directory corrente resta la stessa quando viene creato
434 un processo figlio, la directory corrente della shell diventa anche la
435 directory corrente di qualunque comando da essa lanciato.
436
437 Le funzioni qui descritte servono esaminare e cambiare la directory di lavoro
438 corrente. I prototipi di queste funzioni sono dichiarati in \texttt{unistd.h}. 
439
440 \begin{itemize}
441 \item \texttt{char * getcwd (char * buffer, size\_t size)}
442   
443   Restituisce il filename completo della directory di lavoro corrente nella
444   stringa puntata da \texttt{buffer}, che deve essere precedentemente
445   allocata, per una dimensione massima di \texttt{size}. Si può anche
446   specificare un puntatore nullo come \textit{buffer}, nel qual caso la
447   stringa sarà allocata automaticamente per una dimensione pari a
448   \texttt{size} qualora questa sia diversa da zero, o della lunghezza esatta
449   del pathname altrimenti. In questo caso si deve ricordare di disallocara la
450   stringa una volta cessato il suo utilizzo.
451   
452   La funzione restituisce il puntatore \texttt{buffer} se riesce,
453   \texttt{NULL} se fallisce, in quest'ultimo caso la variabile
454   \texttt{errno} è settata con i seguenti codici di errore:
455
456   \begin{itemize}
457   \item \texttt{EINVAL} L'argomento \texttt{size} è zero e \texttt{buffer} non
458     è nullo.
459   \item \texttt{ERANGE} L'argomento \texttt{size} è più piccolo della
460     lunghezza del pathname. 
461   \item \texttt{EACCES} Manca il permesso di lettura o di ricerca su uno dei
462     componenti del pathname (cioè su una delle directory superiori alla
463     corrente).
464   \end{itemize}
465 \end{itemize}
466
467 Di questa funzione esiste una versione \texttt{char * getwd(char * buffer)}
468 fatta per compatibilità all'indietro con BSD, che non consente di specificare
469 la dimensione del buffer; esso deve essere allocato in precedenza ed avere una
470 dimensione superiore a \texttt{PATH\_MAX} (di solito 256 byters, vedi
471 \ref{sec:xxxx_limits}; il problema è che in linux non esiste una dimensione
472 superiore per un pathname, per cui non è detto che il buffer sia sufficiente a
473 contenere il nome del file, e questa è la ragione principale per cui questa
474 funzione è deprecata.
475
476 Una seconda funzione simile è \texttt{char * get\_current\_dir\_name(void)}
477 che è sostanzialmente equivalente ad una \texttt{getcwd(NULL, 0)}, con la sola
478 differenza che essa ritorna il valore della variabile di ambiente
479 \texttt{PWD}, che essendo costruita dalla shell può contenere anche dei
480 riferimenti simbolici.
481
482 Come già detto in unix anche le directory sono file, è possibile pertanto
483 (come vedremo in \ref{sec:file_dir_access}) riferirsi ad esse tramite il file
484 descriptor dell'interfaccia a basso livello, e non solo tramite il filename;
485 per questo motivo ci sono due diverse funzioni per cambiare directory di
486 lavoro.
487
488 \begin{itemize}
489 \item \texttt{int chdir (const char * pathname)}
490   
491   Come dice il nome (che significa \textit{change directory}) questa funzione
492   serve a cambiare la directory di lavoro a quella speficata dal pathname
493   contenuto nella stringa \texttt{pathname}.
494   
495 \item \texttt{int fchdir (int filedes)} analoga alla precedente, ma usa un
496   file descriptor invece del pathname.
497
498
499   Entrambe le funzioni restituiscono zero in caso di successo e -1 per un
500   errore, in caso di errore \texttt{errno} viene settata secondo i codici di
501   errore standard di accesso ai files (trattati in dettaglio in
502   \ref{sec:file_err_acc}) ai quali si aggiunge il codice \texttt{ENOTDIR} nel
503   caso il \texttt{filename} indichi un file che non sia una directory.
504 \end{itemize}
505
506 \subsection{Creazione di una directory} 
507 \label{sec:file_dir_creat}
508
509 Per creare una nuova directory si può usare la seguente funzione, omonima
510 dell'analogo comando di shell \texttt{mkdir}; per accedere alla funzioni il
511 programma deve includere il file \texttt{sys/stat.h}.
512
513 \begin{itemize}
514 \item \texttt{char * mkdir (const char * dirname, mode\_t mode)}
515   
516   Questa funzione crea una nuova directory vuota con il nome indicato da
517   \texttt{dirname}, assegnandole i permessi indicati da \texttt{mode}. Il nome
518   può essere indicato con il pathname assoluto o relativo.
519
520   La funzione restituisce zero in caso di successo e -1 per un errore, in caso
521   di errore \texttt{errno} viene settata secondo i codici di errore standard
522   di accesso ai files (trattati in dettaglio in \ref{sec:file_err_acc}) ai
523   quali si aggiungono i seguenti:
524   \begin{itemize}
525   \item \texttt{EACCESS} 
526     Non c'è il permesso di scrittura per la directory in cui si vuole inserire
527     la nuova directory.
528   \item \texttt{EEXIST} Un file (o una directory) con quel nome essite di già. 
529   \item \texttt{EMLINK} La directory in cui si vuole creare la nuova directory
530     contiene troppi file. Sotto linux questo normalmente non avviene perchè il
531     filesystem standard consente la creazione di un numero di file maggiore di
532     quelli che possono essere contenuti nell'hard-disk, ma potendo avere a che
533     fare anche con filesystem di altri sistemi questo errore può presentarsi.
534   \item \texttt{ENOSPC} Non c'è abbastanza spazio sul file system per creare
535     la nuova directory.
536   \item \texttt{EROFS} La directory su cui si vuole inserire la nuova
537     directory è su un filesystem montato readonly.
538   \end{itemize}
539 \end{itemize}
540  
541
542 \subsection{Accesso alle directory}
543 \label{sec:file_dir_access}
544
545 Benchè le directory siano oggetti del filesystem come tutti gli altri non ha
546 ovviamente senso aprirle come fossero dei file di dati. Può però essere utile
547 poterne leggere il contenuto ad esempio per fare la lista dei file che esse
548 contengono o ricerche sui medesimi..
549
550 Per accedere al contenuto delle directory si usano i cosiddetti
551 \textit{directory streams} (chiamati così per l'analogia con i file stream);
552 la funzione \texttt{opendir} apre uno di questi stream e la funzione
553 \texttt{readdir} legge il contenuto della directory, i cui elementi sono le
554 \textit{directory entries} (da distinguersi da quelle della cache di cui
555 parlavamo in \ref{sec:file_vfs}) in una opportuna struttura \texttt{struct
556 dirent}.
557
558 \subsection{I link simbolici e i link diretti}
559 \label{sec:file_link}
560
561 Una delle caratteristiche più usate quando si opera con i file è quella di
562 poter creare dei nomi fittizi (alias o collegamenti) per potersi riferire allo
563 stesso file accedendovi da directory diverse. Questo è possibile anche in
564 ambiente unix, dove tali collegamenti sono usualmente chiamati \textit{link},
565 ma data la struttura del sistema ci sono due metodi sostanzialmente diversi
566 per fare questa operazione.
567
568 Come si è già accennato nell'introduzione in un sistema unix l'accesso al
569 contenuto di un file su disco avviene attraverso il suo \textit{inode}, e il
570 nome che si trova in una directory è solo una etichetta associata ad un
571 puntatore a detto inode.  Questo significa che la realizzazione di un links è
572 immediata in quanto uno stesso file può avere tanti nomi diversi allo stesso
573 tempo, dati da altrettante diverse associazioni allo stesso inode; si noti poi
574 che nessuno di questi nomi viene ad assumere una particolare preferenza
575 rispetto agli altri.
576
577 Per aggiungere un nome ad un inode si utilizza la funzione \texttt{link}, e si
578 suole chiamare questa associazione un collegamento diretto (o \textit{hard
579   link}).  La creazione di un nuovo link diretto non copia il contenuto del
580 file, ma si limita ad aumentare di uno il numero di referenze al file (uno dei
581 dati contenuti nell'inode) aggiungendo il nuovo nome ai precedenti. Si noti
582 che uno stesso file può essere così richiamato in diverse directory.
583
584 Siccome tutto ciò funziona facendo riferimento ad un inode, questa funzione
585 può essere applicata soltanto per file che risiedono sullo stesso filesystem,
586 (dato che solo in questo caso è garantita l'unicità dell'inode) e solo per
587 filesystem di tipo unix. Inoltre in linux non è consentito eseguire un link
588 diretto ad una directory.
589
590 Per ovviare a queste limitazioni i sistemi unix supportano un'altra forma di
591 link (i cosiddetti \textit{soft link} o \textit{symbolic link}), che sono,
592 come avviene in altri sistemi operativi, dei file che contengono il
593 semplicemente il riferimento ad un altro file (o directory). In questo modo è
594 possibile effettuare link anche attraverso filesystem diversi e a directory, e
595 pure a file che non esistono ancora.
596
597 Il sistema funziona in quanto i link simbolici sono contrassegnati come tali
598 al kernel (analogamente a quanto avviene per le directory) per cui la chiamata
599 ad una \texttt{open} o una \texttt{stat} su un link simbolico comporta la
600 lettura del contenuto del medesimo e l'applicazione della funzione al file
601 specificato da quest'ultimo. Invece altre funzioni come quelle per cancellare
602 o rinominare i file operano direttamente sul link simbolico. Inoltre esistono
603 funzioni apposite, come la \texttt{readlink} e la \texttt{lstat} per accedere
604 alle informazioni del link invece che a quelle del file a cui esso fa
605 riferimento.
606
607 Le funzioni per operare sui link sono le seguenti, esse sono tutte dichiarate
608 nell'header file \texttt{unistd.h}.
609
610 \begin{itemize}
611 \item \texttt{int link(const char * oldname, const char * newname)}
612   
613   Crea un nuovo link diretto al file indicato da \texttt{oldname} dandogli
614   nome \texttt{newname}.
615   
616   La funzione restituisce zero in caso di successo e -1 per un errore, in caso
617   di errore. La variabile \texttt{errno} viene settata secondo i codici di
618   errore standard di accesso ai files (trattati in dettaglio in
619   \ref{sec:file_err_acc}) ai quali si aggiungono i seguenti:
620
621   \begin{itemize}
622   \item \texttt{EXDEV} \texttt{oldname} e \texttt{newname} non sono sullo
623     stesso filesystem.
624   \item \texttt{EPERM} il filesystem che contiene \texttt{oldname} e
625     \texttt{newname} non supporta i link diretti.
626   \item \texttt{EACCESS} 
627     Non c'è il permesso di scrittura per la directory in cui si vuole creare
628     il nuovo link.
629   \item \texttt{EEXIST} Un file (o una directory) con quel nome esiste di
630     già.
631   \item \texttt{EMLINK} Ci sono troppi link al file \texttt{oldname} (il
632     numero massimo è specificato dalla variabile \texttt{LINK\_MAX}, vedi
633     \ref{sec:sys_limits}.
634   \item \texttt{ENOSPC} La directory in cui si vuole creare il link è piena e
635     non può essere ampliata.
636   \item \texttt{EROFS} La directory su cui si vuole inserire il nuovo link è
637     su un filesystem montato readonly.
638   \end{itemize}
639 \end{itemize}
640
641
642 \begin{itemize}
643 \item \texttt{int symlink(const char * oldname, const char * newname)}
644   
645   Crea un nuovo link simbolico al file indicato da \texttt{oldname} dandogli
646   nome \texttt{newname}.
647   
648   La funzione restituisce zero in caso di successo e -1 per un errore, in caso
649   di errore. La variabile \texttt{errno} viene settata secondo i codici di
650   errore standard di accesso ai files (trattati in dettaglio in
651   \ref{sec:file_err_acc}) ai quali si aggiungono i seguenti:
652
653   \begin{itemize}
654   \item \texttt{EEXIST} Un file (o una directory) con quel nome esiste di
655     già.
656   \item \texttt{EROFS} La directory su cui si vuole inserire il nuovo link è
657     su un filesystem montato readonly.
658   \item \texttt{ENOSPC} La directory o il filesystem in cui si vuole creare il
659     link è piena e non c'è ulteriore spazio disponibile.
660   \item \texttt{ELOOP} Ci sono troppi link simbolici nella risoluzione di
661     \texttt{oldname} o di \texttt{newname}.
662   \end{itemize}
663 \end{itemize}
664
665
666
667
668 \section{L'input/output di basso livello}
669 \label{sec:file_lowlev_io}
670 %
671 % Questa va per ultima. Va bene che e` la più usata, ma è basata sulle altre
672 %
673 \section{I file stream}
674 \label{sec:file_stream}
675
676 Esamineremo in questa sezione l'interfaccia per i file stream, le modalità per
677 crearli, e le funzioni disponibili per leggere, scrivere e compiere le varie
678 operazioni connesse all'uso dei file. L'interfaccia è accessibile includendo
679 l'header file \texttt{stdio.h}.
680
681 Per ragioni storiche la struttura di dati che rappresenta un stream è stata
682 chiamata \texttt{FILE}, questi oggetti sono creati dalle funzioni di libreria
683 e contengono tutte le informazioni necessarie a gestire le operazioni sugli
684 stream, come la posizione corrente, lo stato del buffer e degli indicatori di
685 stato e di fine del file. Per questo motivo gli utenti non devono mai
686 utilizzare direttamente o allocare queste strutture, ma usare sempre puntatori
687 del tipo \texttt{FILE *} (tanto che in certi caso il termine di puntatore a
688 file è diventato sinonimo di stream). 
689
690 \subsection{Gli stream standard}
691 \label{sec:file_stream_std}
692
693 Quando un programma viene lanciato il processo ha sempre tre stream
694 predefiniti aperti, che rappresentano i canali standard di input/output
695 prestabiliti per il processo; anche questi tre stream sono definiti
696 nell'header \texttt{stdio.h} e sono:
697
698 \begin{itemize}
699 \item \texttt{FILE * stdin} Lo \textit{standard input} cioè lo stream da cui
700   il processo riceve ordinariamente i dati in ingresso. Normalmente è associato
701   dalla shell all'input del terminale e prende i caratteri dalla tastiera.
702 \item \texttt{FILE * stdout} Lo \textit{standard input} cioè lo stream su cui
703   il processo invia ordinariamente i dati in uscita. Normalmente è associato
704   dalla shell all'output del terminale e scrive sullo schermo.
705 \item \texttt{FILE * stderr} Lo \textit{standard input} cioè lo stream su cui
706   il processo è supposto inviare i messaaggi di errore. Normalmente anch'esso
707   è associato dalla shell all'output del terminale e scrive sullo schermo.
708 \end{itemize}
709
710 In linux 
711
712
713 %La struttura fondamentale che contiene i dati essenziali relativi ai file è il
714 %cosiddetto \textit{inode}; questo conterrà informazioni come il
715 %tipo di file (file di dispositivo, directory, file di dati, per un elenco
716 %completo vedi \ntab), i permessi (vedi \ref{sec:file_perms}), le date (vedi
717 %\ref{sec:file_times}).
718