+negativo, chiamato appunto \textit{file descriptors}, quando un file viene
+aperto la funzione restituisce il file descriptor, e tutte le successive
+operazioni devono passare il \textit{file descriptors} come argomento.
+
+Per capire come funziona il meccanismo occorre spiegare a grandi linee come è
+che 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}.
+
+La \textit{process table} è una tabella che contiene una voce per ciascun
+processo attivo nel sistema. In Linux la tabella è costituita da strutture di
+tipo \var{task\_struct} nelle quali sono raccolte tutte le informazioni
+relative ad un singolo processo; fra queste informazioni c'è anche il
+puntatore ad una ulteriore struttura di tipo \var{files\_struct} in cui sono
+contenute le informazioni relative ai file che il processo ha aperto, ed in
+particolare:
+\begin{itemize*}
+\item i flag relativi ai file descriptor.
+\item il numero di file aperti.
+\item una tabella che contiene un puntatore alla relativa voce nella
+ \textit{file table} per ogni file aperto.
+\end{itemize*}
+il \textit{file descriptor} in sostanza è l'intero positivo che indicizza
+questa tabella.
+
+La \textit{file table} è una tabella che contiene una voce per ciascun file
+che è stato aperto nel sistema. In Linux è costituita da strutture di tipo
+\var{file}; in ciascuna di esse sono tenute varie informazioni relative al
+file, fra cui:
+\begin{itemize*}
+\item lo stato del file (nel campo \var{f\_flags}).
+\item il valore della posizione corrente (l'\textit{offset}) nel file.
+\item un puntatore all'inode\footnote{nel kernel 2.4.x si è in realtà passati
+ ad un puntatore ad una struttura \var{dentry} che punta a sua volta
+ all'inode passando per la nuova struttura del VFS} del file.
+%\item un puntatore alla tabella delle funzioni \footnote{la struttura
+% \var{f\_op} descritta in \secref{sec:file_vfs_work}} che si possono usare
+% sul file.
+\end{itemize*}
+
+In \figref{fig:file_proc_file} si è riportato uno schema in cui è illustrata
+questa architettura, in cui si sono evidenziate le interrelazioni fra le varie
+strutture di dati sulla quale essa è basata.
+\begin{figure}[htb]
+ \centering
+ \includegraphics[width=14cm]{img/procfile.eps}
+ \caption{Schema della architettura dell'accesso ai file attraverso
+ l'interfaccia dei \textit{file descroptor}}
+ \label{fig:file_proc_file}
+\end{figure}
+Ritorneremo su questo schema più volte, dato che esso è fondamentale per
+capire i dettagli del funzionamento delle dell'interfaccia dei \textit{file
+ descriptor}.
+
+
+\subsection{I file standard}
+\label{sec:file_std_descr}
+
+Come accennato i \textit{file descriptor} non sono altro che un indice nella
+tabella dei file aperti di ciascun processo; per questo motivo essi vengono
+assegnati in successione tutte le volte che si apre un nuovo file (se non se
+ne è chiuso nessuno in precedenza).
+
+In tutti i sistemi unix-like esiste una convenzione generale per cui ogni
+processo viene lanciato con almeno tre file aperti. Questi, per quanto
+dicevamo prima, avranno come \textit{file descriptor} i valori 0, 1 e 2.
+Benché questa sia soltanto una convenzione, essa è seguita dalla gran parte
+delle applicazioni, e non aderirvi potrebbe portare a gravi problemi di
+interoperabilità.
+
+Il primo file è sempre associato a quello che viene chiamato \textit{standard
+ input}, è cioè il file da cui il processo si aspetta di ricevere i dati in
+ingresso (nel caso della shell, è associato alla lettura della tastiera); il
+secondo file è il cosiddetto \textit{standard output}, cioè il file su cui ci
+si aspetta debbano essere inviati i dati in uscita (sempre nel caso della
+shell, è il terminale su cui si sta scrivendo), il terzo è lo \textit{standard
+ error}, su cui viene inviato l'output relativo agli errori.
+Lo standard POSIX.1 provvede tre costanti simboliche, definite nell'header
+\file{unistd.h}, al posto di questi valori numerici:
+\begin{table}[htb]
+ \centering
+ \footnotesize
+ \begin{tabular}[c]{|l|l|}
+ \hline
+ \textbf{Costante} & \textbf{Significato} \\
+ \hline
+ \hline
+ \macro{STDIN\_FILENO} & \textit{file descriptor} dello \textit{standard
+ input} \\
+ \macro{STDOUT\_FILENO} & \textit{file descriptor} dello \textit{standard
+ output} \\
+ \macro{STDERR\_FILENO} & \textit{file descriptor} dello \textit{standard
+ error}\\
+ \hline
+ \end{tabular}
+ \caption{Costanti definite in \file{unistd.h} per i file standard aperti
+ alla creazione di ogni processo.}
+ \label{tab:file_std_files}
+\end{table}
+
+In \curfig\ si è utilizzata questa situazione come esempio, facendo
+riferimento ad un programma in cui lo \textit{standard input} è associato ad
+un file mentre lo \textit{standard output} e lo \textit{standard error} sono
+entrambi associati ad un altro file (e quindi utilizzano lo stesso inode).
+
+Nelle vecchie versioni di unix (ed anche in Linux fino al kernel 2.0.x) il
+numero di file aperti era anche soggetto ad un limite massimo dato dalle
+dimensioni del vettore di puntatori con cui era realizzata la tabella dei file
+descriptor dentro \var{file\_struct}; questo limite intrinseco non sussiste
+più, dato che si è passati ad una linked list, restano i limiti imposti
+dall'amministratore (vedi \secref{sec:sys_limits}).