\chapter{L'interfaccia unix di I/O con i file}
\label{cha:file_unix_interface}

Esamineremo in questo capitolo la prima delle due interfacce di programmazione
per i file, quella dei file descriptor, nativa di unix. Questa è l'interfaccia
di basso livello, che non prevede funzioni evolute come la bufferizzazione o
funzioni di lettura o scrittura formattata, ma è su questa che è costruita
anche l'interfaccia standard dei file definita dallo standard ANSI C.



\section{L'architettura di base}
\label{sec:file_base_arch}

Iniziamo la trattazione con una panoramica sull'architettura base della
intefaccia dei file descriptor. Esamineremo in questa sezione la struttura
base dell'interfaccia con i file di unix, e le modalità con cui i processi
ed il kernel interagiscono per operare sui file. 


\subsection{L'architettura dei \textit{file descriptors}}
\label{sec:file_fd}

Per poter accedere al contenuto di un file occorre creare un canale di
comunicazione con il kernel che renda possibile operare su di esso (si ricordi
quanto visto in \secref{sec:file_vfs_work}), questo si fa aprendo il file con
la funzione \func{open} che provvederà a localizzare l'inode del file e
inizializzare le funzioni che il VFS mette a disposizione (riportate in
\tabref{tab:file_file_operations}). Una volta terminate le operazioni, il file
dovrà essere chiuso, e questo chiuderà il canale di comunicazione impedendo
ogni ulteriore operazione.

All'interno di ogni processo i file aperti sono identificati da un intero non
negativo, chiamato appunto \textit{file descriptors}; all'interno della
struttura (\var{task\_struct}) che identifica il processo nei confronti del
kernel ogni processo mantiene una sezione (la \var{file_struct}, la cui
struttura è riportata in \nfig)

ciascun processo porta
nella ha una tabella dei file aperti, in





Per ciascun file aperto nel sistema il kernel mantiene voce nella tabella dei
file; ciascuna voce di questa tabella contiene:
\begin{itemize}
\item lo stato del file (lettura, scrittura, append, etc.).
\item il valore della posizione corrente (l'\textit{offset}).
\item un puntatore al 
\end{itemize}





\subsection{La condivisione dei files}
\label{sec:file_sharing}



\section{Le funzioni base}
\label{sec:file_base_func}

L'interfaccia standard unix per l'input/output sui file è basata su cinque
funzioni fondamentali \func{open}, \func{read}, \func{write},
\func{lseek} e \func{close};


\subsection{La funzione \texttt{open}}
\label{sec:file_open}

\subsection{La funzione \texttt{creat}}
\label{sec:file_creat}

\subsection{La funzione \texttt{close}}
\label{sec:file_close}

\subsection{La funzione \texttt{lseek}}
\label{sec:file_lseek}

\subsection{La funzione \texttt{read}}
\label{sec:file_read}

\subsection{La funzione \texttt{write}}
\label{sec:file_write}

\subsection{Operazioni atomiche coi file}
\label{sec:file_atomic}

\section{Funzioni avanzate}
\label{sec:file_adv_func}

\subsection{La funzioni \texttt{dup} e \texttt{dup2}}
\label{sec:file_dup}

\subsection{La funzione \texttt{fcntl}}
\label{sec:file_fcntl}

\subsection{La funzione \texttt{ioctl}}
\label{sec:file_ioctl}




