From 4f6d6cb9e5228bfa2341e052acbf23c3d78b2780 Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Mon, 12 Nov 2001 23:18:26 +0000 Subject: [PATCH] Completate: condivisione, operazioni atomiche sui file, dup ed iniziata fcntl --- fileunix.tex | 115 ++++++++++++++++++++++++++++++++++++++++++++++-- gapil.tex | 6 +-- img/filedup.dia | Bin 3049 -> 2990 bytes 3 files changed, 114 insertions(+), 7 deletions(-) diff --git a/fileunix.tex b/fileunix.tex index 3001194..06efeda 100644 --- a/fileunix.tex +++ b/fileunix.tex @@ -758,18 +758,44 @@ creare un file di lock, bloccandosi se il file esiste. In questo caso la sequenza logica porterebbe a verificare prima l'esistenza del file con una \func{stat} per poi crearlo con una \func{creat}; di nuovo avremmo la possibilità di una race condition da parte di un altro processo che crea lo -stesso file fra il controllo e la creazione. - -Per questo motivo sono stati introdotti i flag \macro{O\_CREAT} -\macro{O\_EXCL} +stesso file fra il controllo e la creazione. +Per questo motivo sono stati introdotti i due flag \macro{O\_CREAT} e +\macro{O\_EXCL}, in questo modo l'operazione di controllo dell'esistenza del +file (con relativa uscita dalla funzione con un errore) e creazione in caso di +assenza, diventa atomica essendo svolta tutta all'interno di una singola +\func{open}. \subsection{La funzioni \func{dup} e \func{dup2}} \label{sec:file_dup} +Abbiamo già visto in \secref{sec:file_sharing} come un processo figlio +condivida gli stessi file descriptor del padre; è possibile però ottenere un +comportamento analogo all'interno di uno stesso processo \textit{duplicando} +un file descriptor. Per far questo si usa la funzione \func{dup} il cui +prototipo è: +\begin{prototype}{unistd.h}{int dup(int oldfd)} + + La funzione crea una copia del file descriptor \param{oldfd}. + + La funzione ritorna il nuovo file descriptor in caso di successo e -1 in + caso di errore, nel qual caso \var{errno} viene settata ad uno dei valori: + \begin{errlist} + \item \macro{EBADF} \param{oldfd} non è un file aperto. + \item \macro{EMFILE} si è raggiunto il numero massimo consentito di file + descriptor aperti. + \end{errlist} +\end{prototype} +La funzione ritorna, come \func{open}, il primo file descriptor libero. Il +file descriptor è una copia esatta del precedente ed entrambi possono essere +interscambiati nell'uso. Per capire meglio il funzionamento della funzione si +può fare riferimento a \figref{fig:file_dup}: l'effetto della funzione è +semplicamente quello di copiare il valore nella struttura \var{file\_struct}, +cosicché anche il nuovo file descriptor fa riferirimento alla stessa voce +nella \textit{file table}. \begin{figure}[htb] \centering \includegraphics[width=14cm]{img/filedup.eps} @@ -777,10 +803,91 @@ Per questo motivo sono stati introdotti i flag \macro{O\_CREAT} \label{fig:file_dup} \end{figure} +In questo modo entrambi i file condivideranno eventuali lock, \textit{file + status flag}, e posizione corrente: se ad esempio \func{lseek} modifica la +posizione su uno dei due file descriptor essa sarà modificata anche sull'altro +(al solito viene modificato lo stesso campo nella voce della \textit{file + table} a cui entrambi fanno riferimento). + +L'unica differenza fra i due file descriptor è che ciascuno avrà il suo +\textit{file descriptor flag}; nel caso di \func{dup} il flag di \textit{close + on exec} viene sempre cancellato nella copia. + +Una diversa versione della funzione, \func{dup2} viene utilizzata per +specificare esplicitamente il nuovo file descriptor; il suo prototipo è: +\begin{prototype}{unistd.h}{int dup2(int oldfd, int newfd)} + + La funzione rende \param{newfd} una copia del file descriptor \param{oldfd}. + + La funzione ritorna il nuovo file descriptor in caso di successo e -1 in + caso di errore, nel qual caso \var{errno} viene settata ad uno dei valori: + \begin{errlist} + \item \macro{EBADF} \param{oldfd} non è un file aperto o \param{newfd} ha un + valore fuori dall'intervallo consentito per i file descriptor. + \item \macro{EMFILE} si è raggiunto il numero massimo consentito di file + descriptor aperti. + \end{errlist} +\end{prototype} +\noindent la funzione chiude il file descriptor \param{newfd} se è aperto. + +La duplicazione dei file descriptor può essere effettuata anche usando la +funzione di controllo dei file \func{fnctl} (che esamineremo in +\secref{sec:file_fcntl}) con il parametro \macro{F\_DUPFD}. + +L'operazione ha la sintassi \func{fnctl(oldfd, F\_DUPFD, newfd)} e se si usa 0 +come valore per \param{newfd} diventa equivalente a \func{dup}. La sola +differenza, a parte i codici di errore, è che \func{dup2} chiude il nuovo file +se è già aperto mentre \func{fcntl} apre il primo disponibile con un valore +superiore, per cui per poterla usare come \func{dup2} occorrerebbe prima +effettare una \func{close}, perdendo l'atomicità dell'operazione. + +L'uso principale di queste funzioni è per la redirezione dell'input e +dell'output fra l'esecuzione di una \func{fork} e la successiva \func{exec}; +diventa così possibile associare un file (o una pipe) allo standard input o +allo standard output, torneremo su questo uso più avanti quando tratteremo le +pipe. + \subsection{La funzione \func{fcntl}} \label{sec:file_fcntl} +Oltre alle operazioni base esaminate in \secref{sec:file_base_func} esistono +tutta una serie di operazioni ausiliarie che è possibile eseguire su un file +descriptor. Per queste operazioni di manipolazione delle varie proprietà di un +file descriptor viene usata la funzione \func{fcntl} il cui prototipo è: +\begin{functions} + \headdecl{unistd.h} + \headdecl{fcntl.h} + \funcdecl{int fcntl(int fd, int cmd)} + \funcdecl{int fcntl(int fd, int cmd, long arg)} + \funcdecl{int fcntl(int fd, int cmd, struct flock *lock)} + La funzione esegue una delle possibili operazioni specificate da \param{cmd} + sul file \param{fd}. + + La funzione ha valori di ritorno diversi a seconda dell'operazione. In caso + di errore il valore di ritorno è -1 e la variabile \var{errno} viene settata + ad un opportuno codice, quelli validi in generale sono: + \begin{errlist} + \item \macro{EBADF} \param{oldfd} non è un file aperto. + \end{errlist} +\end{functions} + +Il comportamento di questa funzione è determinato dal valore del comando +\param{cmd} che le viene fornito; in \secref{sec:file_dup} abbiamo incontrato +un esempio, una lista dei possibili valori è riportata di seguito: +\begin{basedescript}{\desclabelwidth{2.0cm}} +\item[\macro{F\_DUPFD}] trova il primo file descriptor disponibile di valore + maggiore o uguale ad \param{arg} e ne fa una copia di \var{fd}. In caso di + successo ritorna il nuovo file descriptor. Gli errori possibili sono + \macro{EINVAL} se \param{arg} è negativo o maggiore del massimo consentito o + \macro{EMFILE} se il processo ha già raggiunto il massimo numero di + descrittori consentito. +\item[\macro{F\_GETFD}] ritorna il valore dei \textit{file descriptor flag} di + \var{fd}, al momento è definito solo \macro{FD\_CLOEXEC}. Prova prov proep +\item[\macro{F\_SETFD}] setta il valore dei \textit{file descriptor flag} + specificato da \param{arg}. +\end{basedescript} + \subsection{La funzione \func{ioctl}} \label{sec:file_ioctl} diff --git a/gapil.tex b/gapil.tex index ee3e1a0..3b8ed0b 100644 --- a/gapil.tex +++ b/gapil.tex @@ -1,7 +1,7 @@ -%% +%% %% GaPiL : Guida alla Programmazione in Linux -%% -%% S. Piccardi Oct. 2000 +%% +%% S. Piccardi Oct. 2000 %% %% main.tex: file principale, gli altri vanno inclusi da questo. %% diff --git a/img/filedup.dia b/img/filedup.dia index 972233cf888a37c14bb712636aa302bef8155901..9519a40d0b79286e9a41989eaade173efaec432c 100644 GIT binary patch delta 2966 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 TzuPR>ef#u({01F4Sl$2t(`3J8 -- 2.30.2