\chapter{I/O avanzato}
\label{cha:file_advanced}

In questo capitolo affronteremo le tematiche della gestione avanzata delle
funzioni di input/ouput, prenderemo in esame il \textit{file locking}, la
gestione dell'input/output da più file, per concludere con la gestione dei
file mappati in memoria.


\section{L'I/O avanzato}
\label{sec:file_advanced_io}

Uno dei problemi che ci si trova ad affrontare con le funzioni ordinarie
trattate in \capref{cha:file_unix_interface} è quello in cui si devono
eseguire su più di un file descriptor delle operazioni che possono bloccarsi:
il problema è che mentre si è bloccati su un file un'altro potrebbe essere
libero.

In questa sezione vedremo come si possono affrontare queste problematiche,
quali sono le soluzioni possibili e quali i meccanismi il kernel e le librerie
ci mettono a disposizione.


\subsection{La modalità di I/O \textsl{non-bloccante}}
\label{sec:file_noblocking}

Una prima soluzione per evitare di bloccarsi nelle operazioni di I/O è quella
di utilizzare la modalità \textsl{non-bloccante}. Abbiamo visto in
\secref{sec:sig_gen_beha}, affrontando la suddivisione fra \textit{fast} e
\textit{slow} system call, che in certi casi le funzioni di I/O possono
bloccarsi indefinitamente.\footnote{si ricordi però che questo può accadere
  solo per le pipe, i socket ed alcuni file di dispositivo; sui file normali
  le funzioni di lettura e scrittura ritornano sempre subito.} 
In particolare le operazioni di lettura possono bloccarsi quando non ci sono
dati disponibili sul descrittore su cui si sta operando.

Abbiamo già accennato in \secref{sec:file_open} che è possibile prevenire
questo tipo di comportamento aprendo il file in modalità non bloccante,
specificando il flag \macro{O\_NONBLOCK}. In questo caso le funzioni che si
sarebbero bloccate ritornano immediatamente restituendo l'errore
\macro{EAGAIN}.

Esistono molti casi però in cui non si vuole che questo avvenga



%\section{I/O asincrono}
%\label{sec:file_asynchronous}

%Non supportato in Linux, in BSD e SRv4 c'è, ma usando il segnale \macro{SIGIO}
%per indicare che i dati sono disponibili, può essere usato in maniera semplice
%con un solo file per processo (altrimenti non sarebbe più possibile
%distinguere da quale file proviene l'attività che ha causato l'emissione del
%segnale).

\subsection{L'I/O asincrono}
\label{sec:file_asyncronous_io}



\subsection{Le funzioni \func{poll} e \func{select}}
\label{sec:file_multiplexing}






\section{File locking}
\label{sec:file_locking}

In \secref{sec:file_sharing} abbiamo preso in esame le mosalità in cui un
sistema unix-like gestisce la condivisione dei file. In quell'occasione si è
visto come, con l'eccezione dei file aperti in \textit{append mode}, quando
più processi scrivono contemporaneamente sullo stesso file non è possibile
determinare la sequenza in cui essi opereranno.

Questo causa la possibilità di race condition; in generale le situazioni più
comuni sono due: l'interazione fra un processo che scrive e altri che leggono,
in cui questi ultimi possono leggere informazioni scritte solo in maniera
parziale o incompleta; o quella in cui diversi processi scrivono, mescolando
in maniera imprevedebile il loro output sul file.

In tutti questi casi il \textit{file locking} è la tecnica che permette di
evitare le race condition, attraverso una serie di funzioni che permettono di
bloccare l'accesso al file da parte di altri processi così da evitare le
sovrapposizioni, e garantire la atomicità delle operazioni di scrittura.


\subsection{Il \textit{advisory locking}}
\label{sec:file_record_locking}

La prima modalità di file locking che è stata implementata nei sistemi
unix-like è quella che viene usualmente chiamata \textit{advisory locking}, in
quanto è il processo, e non il sistema, che si incarica di verificare se
esiste una condizione di blocco per l'accesso ai file.




\subsection{Il \textit{mandatory locking}}
\label{sec:file_mand_locking}

Il \textit{mandatory locking} è una opzione introdotta inizialmente in SVR4, 




\section{File mappati in memoria}
\label{sec:file_memory_map}



%%% Local Variables: 
%%% mode: latex
%%% TeX-master: "gapil"
%%% End: 
