From: Simone Piccardi Date: Sun, 4 Nov 2001 13:58:49 +0000 (+0000) Subject: Si prosegue con i file. X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=commitdiff_plain;h=c32a11a121ae117619653e8c6421932114f46080 Si prosegue con i file. --- diff --git a/fileunix.tex b/fileunix.tex index b747a4d..bc50b42 100644 --- a/fileunix.tex +++ b/fileunix.tex @@ -13,9 +13,11 @@ ANSI C. \section{L'architettura di base} \label{sec:file_base_arch} -Esamineremo in questa sezione la architettura su cui è basata dell'interfaccia -con cui i processi accedono ai file, che, pure nelle differenze di -implementazione, è comune ad ogni implementazione di unix. +In questa sezione faremo una breve introduzione sulla architettura su cui è +basata dell'interfaccia dei \textit{file descriptor}, che, sia pure con +differenze di implementazione, è comune ad ogni implementazione di unix. +Vedremo cosa comporti questa architettura in caso di accesso contemporaneo ai +file da parte di più processi. \subsection{L'architettura dei \textit{file descriptors}} @@ -47,12 +49,12 @@ relative ad un singolo processo; fra queste informazioni c' 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} +\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} +\end{itemize*} il \textit{file descriptor} in sostanza è l'intero positivo che indicizza questa tabella. @@ -60,43 +62,46 @@ La \textit{file table} 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} +\begin{itemize*} \item lo stato del file (lettura, scrittura, append, etc.). \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 \nfig\ si è riportato lo schema di questa architettura, con le -interrelazioni fra tutti questi elementi. - +%\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 delle operazioni del VFS} - \label{fig:file_VFS_scheme} + \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 normalmente -essi vengono assegnati in successione tutte le volte che apre un nuovo file -(senza averne chiuso nessuno in precedenza). - +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 seguirla potrebbe portare a gravi problemi di -incompatibilità. - +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 @@ -108,19 +113,37 @@ shell, Lo standard POSIX.1 provvede tre costanti simboliche, definite nell'header \file{unistd.h}, al posto di questi valori numerici: -\begin{itemize} -\item \macro{STDIN\_FILENO} \textit{file descriptor} dello \textit{standard - input} -\item \macro{STDOUT\_FILENO} \textit{file descriptor} dello \textit{standard - output} -\item \macro{STDERR\_FILENO} \textit{file descriptor} dello \textit{standard - error} -\end{itemize} - - - -\subsection{La condivisione dei files} -\label{sec:file_sharing} +\begin{table}[htb] + \centering + \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}). @@ -128,13 +151,66 @@ Lo standard POSIX.1 provvede tre costanti simboliche, definite nell'header \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}; +funzioni fondamentali \func{open}, \func{read}, \func{write}, \func{lseek} e +\func{close}, usate rispettivamente per aprire, leggere, scrivere, spostarsi e +chiudere un file. + +La gran parte delle operazioni sui file si effettua attraverso queste cinque +funzioni, esse vengono chiamate anche funzioni di I/O non bufferizzato, per +contrapporle alle analoghe previste dallo standard ANSI C (che vedremo in +\secref{sec:file_ansi_base_func}), dato che effettuano le operazioni di lettura +e scrittura usando direttamente le system call del kernel. \subsection{La funzione \func{open}} \label{sec:file_open} +La funzione \func{open} è la funzione fondamentale per accedere ai file, ed è +quella che crea l'associazione fra un pathname ed un file descriptor; il suo +prototipo è: + +\begin{functions} + \headdecl{sys/types.h} + \headdecl{sys/stat.h} + \headdecl{fcntl.h} + \funcdecl{int open(const char *pathname, int flags)} + \funcdecl{int open(const char *pathname, int flags, mode\_t mode)} + Apre il file indicato da \var{pathname} nella modalità indicata da + \var{flags}, e, nel caso il file sia creato, con gli eventuali permessi + specificati da \var{mode}. + + La funzione ritorna il file descriptor in caso di successo e -1 in caso di + errore. In questo caso la variabile \var{errno} viene settata ad uno dei + valori: + + \begin{errlist} + \item \macro{EEXIST} \var{pathname} esiste e si è specificato + \macro{O\_CREAT} e \macro{O\_EXCL}. + \item \macro{EISDIR} \var{pathname} indica una directory e si è tentato + l'accesso in scrittura. + \item \macro{ENOTDIR} un componente di \var{pathname} non è una directory o + si è specificato \macro{O\_DIRECTORY} e \var{pathname} non è una + directory. + \item \macro{ENXIO} si sono settati \macro{O\_NOBLOCK} o \macro{O\_WRONLY} + ed il file è una fifo che non viene letta da nessun processo o + \var{pathname} è un file di dispositivo ma il dispositivo è assente. + \item \macro{ENODEV} \var{pathname} si riferisce a un file di dispositivo + che non esiste. + \item \macro{ETXTBSY} si è cercato di accedere in scrittura all'immagine di + un programma in esecuzione. + \item \macro{ELOOP} si sono incotrati troppi link simbolici nel risolvere + pathname o si è indicato \macro{O\_NOFOLLOW} e \var{pathname} è un link + simbolico. + \end{errlist} + ed inoltre \macro{EACCES}, \macro{ENAMETOOLONG}, \macro{ENOENT}, + \macro{EROFS}, \macro{EFAULT}, \macro{ENOSPC}, \macro{ENOMEM}, + \macro{EMFILE} e \macro{ENFILE}. +\end{functions} + + + + + \subsection{La funzione \func{creat}} \label{sec:file_creat} @@ -150,12 +226,17 @@ funzioni fondamentali \func{open}, \func{read}, \func{write}, \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 condivisione dei files} +\label{sec:file_sharing} + +\subsection{Operazioni atomiche coi file} +\label{sec:file_atomic} + + \subsection{La funzioni \func{dup} e \func{dup2}} \label{sec:file_dup} diff --git a/gapil.tex b/gapil.tex index 1364419..6a44c54 100644 --- a/gapil.tex +++ b/gapil.tex @@ -1,4 +1,4 @@ -%% +%% %% GaPiL : Guida alla Programmazione in Linux %% %% S. Piccardi Oct. 2000 diff --git a/img/procfile.dia b/img/procfile.dia index cd8131c..d20b2a3 100644 Binary files a/img/procfile.dia and b/img/procfile.dia differ diff --git a/system.tex b/system.tex index 56ae1d1..7a44a35 100644 --- a/system.tex +++ b/system.tex @@ -208,3 +208,7 @@ o la macro (\texttt{\small 15--17}) associate a quel codice. \label{fig:intro_err_mess} \end{figure} + +\subsection{Valori e limiti del sistema} +\label{sec:sys_limits} +