X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=fileunix.tex;h=86652f3d57c6b1d09978ac9f680804135420cf01;hp=2aeda784b8de5e9eaab35bff174923d18572a019;hb=844ed2345d6004d47ec70e8e9b17b3dcd87a1b80;hpb=66765a9be9a61085dd00abd92d99a24b23dc844b diff --git a/fileunix.tex b/fileunix.tex index 2aeda78..86652f3 100644 --- a/fileunix.tex +++ b/fileunix.tex @@ -1,55 +1,132 @@ -\chapter{I files: l'interfaccia I/O di unix} +\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{I file descriptors} -\label{sec:fileunix_fd} +\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}. La relazione fra queste tabelle è mostrata in \nfig. + + +\begin{figure}[htb] + \centering + \includegraphics[width=7cm]{img/procfile.eps} + \caption{Schema delle operazioni del VFS} + \label{fig:file_VFS_scheme} +\end{figure} + + +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 relativi ai file descriptor. +\item un puntatore alla struttura \var{file} nella \textit{file table} per + ogni file aperto. +\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 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 (da cui si + accede all'inode). +\item un puntatore alla tabella delle operazioni definite sul file (si ricordi + quanto detto a proposito di \tabref{tab:file_file_operations} nella + spiegazione del VFS di Linux). +\end{itemize} -\section{Le funzioni base} -\label{sec:fileunix_base_func} -L'interfaccia standard unix per l'input/output sui file è su cinque funzioni -\texttt{open}, \texttt{read}, \texttt{write}, \texttt{lseek}, \texttt{close} -\subsection{La funzione \texttt{open}} -\label{sec:fileunix_open} +All'interno di ogni processo i file aperti sono identificati da un intero non +negativo, chiamato appunto \textit{file descriptors}; -\subsection{La funzione \texttt{creat}} -\label{sec:fileunix_creat} -\subsection{La funzione \texttt{close}} -\label{sec:fileunix_close} -\subsection{La funzione \texttt{lseek}} -\label{sec:fileunix_lseek} -\subsection{La funzione \texttt{read}} -\label{sec:fileunix_read} -\subsection{La funzione \texttt{write}} -\label{sec:fileunix_write} +\subsection{La condivisione dei files} +\label{sec:file_sharing} -\section{La condivisione dei files} -\label{sec:fileunix_sharing} -\subsection{Operazioni atomiche} -\label{sec:fileunix_atomic} +\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:fileunix_adv_func} +\label{sec:file_adv_func} + +\subsection{La funzioni \func{dup} e \func{dup2}} +\label{sec:file_dup} -\subsection{La funzioni \texttt{dup} e \texttt{dup2}} -\label{sec:fileunix_dup} +\subsection{La funzione \func{fcntl}} +\label{sec:file_fcntl} -\subsection{La funzione \texttt{fcntl}} -\label{sec:fileunix_fcntl} +\subsection{La funzione \func{ioctl}} +\label{sec:file_ioctl} -\subsection{La funzione \texttt{ioctl}} -\label{sec:fileunix_ioctl}