Correzioni e inizio architettura file
[gapil.git] / fileunix.tex
1 \chapter{L'interfaccia unix di I/O con i file}
2 \label{cha:file_unix_interface}
3
4 Esamineremo in questo capitolo la prima delle due interfacce di programmazione
5 per i file, quella dei \textit{file descriptor}, nativa di unix. Questa è
6 l'interfaccia di basso livello, che non prevede funzioni evolute come la
7 bufferizzazione o funzioni di lettura o scrittura formattata, ma è su questa
8 che è costruita anche l'interfaccia standard dei file definita dallo standard
9 ANSI C.
10
11
12
13 \section{L'architettura di base}
14 \label{sec:file_base_arch}
15
16 Esamineremo in questa sezione la architettura su cui è basata dell'interfaccia
17 con cui i processi accedono ai file, che, pure nelle differenze di
18 implementazione, è comune ad ogni implementazione di unix. 
19
20
21 \subsection{L'architettura dei \textit{file descriptors}}
22 \label{sec:file_fd}
23
24 Per poter accedere al contenuto di un file occorre creare un canale di
25 comunicazione con il kernel che renda possibile operare su di esso (si ricordi
26 quanto visto in \secref{sec:file_vfs_work}). Questo si fa aprendo il file con
27 la funzione \func{open} che provvederà a localizzare l'inode del file e
28 inizializzare le funzioni che il VFS mette a disposizione (riportate in
29 \tabref{tab:file_file_operations}). Una volta terminate le operazioni, il file
30 dovrà essere chiuso, e questo chiuderà il canale di comunicazione impedendo
31 ogni ulteriore operazione.
32
33 All'interno di ogni processo i file aperti sono identificati da un intero non
34 negativo, chiamato appunto \textit{file descriptors}, quando un file viene
35 aperto la funzione restituisce il file descriptor, e tutte le successive
36 operazioni devono passare il \textit{file descriptors} come argomento.
37
38 Per capire come funziona il meccanismo occorre spiegare a grandi linee come è
39 che il kernel gestisce l'interazione fra processi e file.  Il kernel mantiene
40 sempre un elenco dei processi attivi nella cosiddetta \textit{process table}
41 ed un elenco dei file aperti nella \textit{file table}.
42
43 La \textit{process table} è una tabella che contiene una voce per ciascun
44 processo attivo nel sistema. In Linux la tabella è costituita da strutture di
45 tipo \var{task\_struct} nelle quali sono raccolte tutte le informazioni
46 relative ad un singolo processo; fra queste informazioni c'è anche il
47 puntatore ad una ulteriore struttura di tipo \var{files\_struct} in cui sono
48 contenute le informazioni relative ai file che il processo ha aperto, ed in
49 particolare:
50 \begin{itemize}
51 \item i flag relativi ai file descriptor.
52 \item il numero di file aperti.
53 \item una tabella che contiene un puntatore alla relativa voce nella
54   \textit{file table} per ogni file aperto.
55 \end{itemize}
56 il \textit{file descriptor} in sostanza è l'intero positivo che indicizza
57 questa tabella.
58
59 La \textit{file table} è una tabella che contiene una voce per ciascun file
60 che è stato aperto nel sistema. In Linux è costituita da strutture di tipo
61 \var{file}; in ciascuna di esse sono tenute varie informazioni relative al
62 file, fra cui:
63 \begin{itemize}
64 \item lo stato del file (lettura, scrittura, append, etc.).
65 \item il valore della posizione corrente (l'\textit{offset}) nel file.
66 \item un puntatore all'inode\footnote{nel kernel 2.4.x si è in realtà passati
67     ad un puntatore ad una struttura \var{dentry} che punta a sua volta
68     all'inode passando per la nuova struttura del VFS} del file.
69 \item un puntatore alla tabella delle funzioni \footnote{la struttura
70     \var{f\_op} descritta in \secref{sec:file_vfs_work}} che si possono usare
71   sul file.
72 \end{itemize}
73 In \nfig\ si è riportato lo schema di questa architettura, con le
74 interrelazioni fra tutti questi elementi.
75
76 \begin{figure}[htb]
77   \centering
78   \includegraphics[width=14cm]{img/procfile.eps}
79   \caption{Schema delle operazioni del VFS}
80   \label{fig:file_VFS_scheme}
81 \end{figure}
82
83
84 \subsection{I file standard}
85 \label{sec:file_std_descr}
86
87 Come accennato i \textit{file descriptor} non sono altro che un indice nella
88 tabella dei file aperti di ciascun processo; per questo motivo normalmente
89 essi vengono assegnati in successione tutte le volte che apre un nuovo file
90 (senza averne chiuso nessuno in precedenza).  
91
92
93 In tutti i sistemi unix-like esiste una convenzione generale per cui ogni
94 processo viene lanciato con almeno tre file aperti. Questi, per quanto
95 dicevamo prima, avranno come \textit{file descriptor} i valori 0, 1 e 2.
96 Benché questa sia soltanto una convenzione, essa è seguita dalla gran parte
97 delle applicazioni, e non seguirla potrebbe portare a gravi problemi di
98 incompatibilità.
99
100
101 Il primo file è sempre associato a quello che viene chiamato \textit{standard
102   input}, è cioè il file da cui il processo si aspetta di ricevere i dati in
103 ingresso (nel caso della shell, è associato alla lettura della tastiera); il
104 secondo file è il cosiddetto \textit{standard output}, cioè il file su cui ci
105 si aspetta debbano essere inviati i dati in uscita (sempre nel caso della
106 shell, è il terminale su cui si sta scrivendo), il terzo è lo \textit{standard
107   error}, su cui viene inviato l'output relativo agli errori.
108
109 Lo standard POSIX.1 provvede tre costanti simboliche, definite nell'header
110 \file{unistd.h}, al posto di questi valori numerici: 
111 \begin{itemize}
112 \item \macro{STDIN\_FILENO} \textit{file descriptor} dello \textit{standard
113     input}
114 \item \macro{STDOUT\_FILENO} \textit{file descriptor} dello \textit{standard
115     output}
116 \item \macro{STDERR\_FILENO} \textit{file descriptor} dello \textit{standard
117     error}
118 \end{itemize}
119
120
121
122 \subsection{La condivisione dei files}
123 \label{sec:file_sharing}
124
125
126
127 \section{Le funzioni base}
128 \label{sec:file_base_func}
129
130 L'interfaccia standard unix per l'input/output sui file è basata su cinque
131 funzioni fondamentali \func{open}, \func{read}, \func{write},
132 \func{lseek} e \func{close};
133
134
135 \subsection{La funzione \func{open}}
136 \label{sec:file_open}
137
138 \subsection{La funzione \func{creat}}
139 \label{sec:file_creat}
140
141 \subsection{La funzione \func{close}}
142 \label{sec:file_close}
143
144 \subsection{La funzione \func{lseek}}
145 \label{sec:file_lseek}
146
147 \subsection{La funzione \func{read}}
148 \label{sec:file_read}
149
150 \subsection{La funzione \func{write}}
151 \label{sec:file_write}
152
153 \subsection{Operazioni atomiche coi file}
154 \label{sec:file_atomic}
155
156 \section{Funzioni avanzate}
157 \label{sec:file_adv_func}
158
159 \subsection{La funzioni \func{dup} e \func{dup2}}
160 \label{sec:file_dup}
161
162 \subsection{La funzione \func{fcntl}}
163 \label{sec:file_fcntl}
164
165 \subsection{La funzione \func{ioctl}}
166 \label{sec:file_ioctl}
167
168
169
170
171