\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.

Per capire come funziona questo canale di comunicazione occorre spiegare
brevemente qual'è architettura con cui il kernel gestisce l'interazione fra
processi e file.  Il kernel mantiene sempre un elenco dei processi
attivi nella cosiddetta \textit{process table} ed un elenco dei file aperti
nella \textit{file table}. 

Ciascuna voce della \textit{process table}, che in Linux è costituita da una
struttura \var{task\_struct}, contiene le informazioni relative ad ogni
processo attivo nel sistema; fra queste c'è anche il puntatore ad una
ulteriore struttura \var{files\_struct} in cui sono contenute le informazioni
relative a ogni file che il processo ha aperto, ed in particolare:
\begin{itemize}
\item i flag di close on esec 
\item un puntatore alla struttura \var{file} nella \textit{file table}
\end{itemize}

Ciascuna voce della \textit{file table}, che in Linux è costituita da una
struttura \var{file}, contiene le informazioni relative ad ogni file aperto
nel sistema, fra queste ci sono:
\begin{itemize}
\item lo stato del file (lettura, scrittura, append, etc.).
\item il valore della posizione corrente (l'\textit{offset}).
\item un puntatore alla dentry del file (da cui si accede all'inode).
\item un puntatore alla tabella delle operazioni del filesystem (vedi
  \tabref{tab:file_file_operations}).
\end{itemize}


Le relazioni fra queste strutture sono riportate in \nfig; 



All'interno di ogni processo i file aperti sono identificati da un intero non
negativo, chiamato appunto \textit{file descriptors};





\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 \func{open}}
\label{sec:file_open}

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

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

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

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

\subsection{La funzione \func{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 \func{dup} e \func{dup2}}
\label{sec:file_dup}

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

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




