86652f3d57c6b1d09978ac9f680804135420cf01
[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 file descriptor, nativa di unix. Questa è l'interfaccia
6 di basso livello, che non prevede funzioni evolute come la bufferizzazione o
7 funzioni di lettura o scrittura formattata, ma è su questa che è costruita
8 anche l'interfaccia standard dei file definita dallo standard ANSI C.
9
10
11
12 \section{L'architettura di base}
13 \label{sec:file_base_arch}
14
15 Iniziamo la trattazione con una panoramica sull'architettura base della
16 intefaccia dei file descriptor. Esamineremo in questa sezione la struttura
17 base dell'interfaccia con i file di unix, e le modalità con cui i processi
18 ed il kernel interagiscono per operare sui file. 
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 Per capire come funziona questo canale di comunicazione occorre spiegare
34 brevemente qual'è architettura con cui il kernel gestisce l'interazione fra
35 processi e file.  Il kernel mantiene sempre un elenco dei processi attivi
36 nella cosiddetta \textit{process table} ed un elenco dei file aperti nella
37 \textit{file table}. La relazione fra queste tabelle è mostrata in \nfig.
38
39
40 \begin{figure}[htb]
41   \centering
42   \includegraphics[width=7cm]{img/procfile.eps}
43   \caption{Schema delle operazioni del VFS}
44   \label{fig:file_VFS_scheme}
45 \end{figure}
46
47
48 Ciascuna voce della \textit{process table}, che in Linux è costituita da una
49 struttura \var{task\_struct}, contiene le informazioni relative ad ogni
50 processo attivo nel sistema; fra queste c'è anche il puntatore ad una
51 ulteriore struttura \var{files\_struct} in cui sono contenute le informazioni
52 relative a ogni file che il processo ha aperto, ed in particolare:
53 \begin{itemize}
54 \item i flag relativi ai file descriptor.
55 \item un puntatore alla struttura \var{file} nella \textit{file table} per
56   ogni file aperto.
57 \end{itemize}
58
59 Ciascuna voce della \textit{file table}, che in Linux è costituita da una
60 struttura \var{file}, contiene le informazioni relative ad ogni file aperto
61 nel sistema, fra queste ci sono:
62 \begin{itemize}
63 \item lo stato del file (lettura, scrittura, append, etc.).
64 \item il valore della posizione corrente (l'\textit{offset}).
65 \item un puntatore all'inode\footnote{nel kernel 2.4.x si è in realtà passati
66     ad un puntatore ad una struttura \var{dentry} che punta a sua volta
67     all'inode passando per la nuova struttura del VFS} del file (da cui si
68   accede all'inode).
69 \item un puntatore alla tabella delle operazioni definite sul file (si ricordi
70   quanto detto a proposito di \tabref{tab:file_file_operations} nella
71   spiegazione del VFS di Linux).
72 \end{itemize}
73
74
75
76
77 All'interno di ogni processo i file aperti sono identificati da un intero non
78 negativo, chiamato appunto \textit{file descriptors};
79
80
81
82
83
84 \subsection{La condivisione dei files}
85 \label{sec:file_sharing}
86
87
88
89 \section{Le funzioni base}
90 \label{sec:file_base_func}
91
92 L'interfaccia standard unix per l'input/output sui file è basata su cinque
93 funzioni fondamentali \func{open}, \func{read}, \func{write},
94 \func{lseek} e \func{close};
95
96
97 \subsection{La funzione \func{open}}
98 \label{sec:file_open}
99
100 \subsection{La funzione \func{creat}}
101 \label{sec:file_creat}
102
103 \subsection{La funzione \func{close}}
104 \label{sec:file_close}
105
106 \subsection{La funzione \func{lseek}}
107 \label{sec:file_lseek}
108
109 \subsection{La funzione \func{read}}
110 \label{sec:file_read}
111
112 \subsection{La funzione \func{write}}
113 \label{sec:file_write}
114
115 \subsection{Operazioni atomiche coi file}
116 \label{sec:file_atomic}
117
118 \section{Funzioni avanzate}
119 \label{sec:file_adv_func}
120
121 \subsection{La funzioni \func{dup} e \func{dup2}}
122 \label{sec:file_dup}
123
124 \subsection{La funzione \func{fcntl}}
125 \label{sec:file_fcntl}
126
127 \subsection{La funzione \func{ioctl}}
128 \label{sec:file_ioctl}
129
130
131
132
133