X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=fileunix.tex;h=95d27afda8f56b4f02831a705daf1b7a017634da;hp=bc50b420f643e21720941096110ad5b3e583bc6f;hb=5638dceb842da9dff14b0c08bcc0e4e65fb79c44;hpb=c32a11a121ae117619653e8c6421932114f46080 diff --git a/fileunix.tex b/fileunix.tex index bc50b42..95d27af 100644 --- a/fileunix.tex +++ b/fileunix.tex @@ -63,7 +63,7 @@ che \var{file}; in ciascuna di esse sono tenute varie informazioni relative al file, fra cui: \begin{itemize*} -\item lo stato del file (lettura, scrittura, append, etc.). +\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 @@ -110,11 +110,11 @@ secondo file 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} \\ @@ -156,10 +156,9 @@ funzioni fondamentali \func{open}, \func{read}, \func{write}, \func{lseek} 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. +funzioni, esse vengono chiamate anche funzioni di I/O non bufferizzato dato +che effettuano le operazioni di lettura e scrittura usando direttamente le +system call del kernel. \subsection{La funzione \func{open}} @@ -188,9 +187,8 @@ prototipo \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{ENOTDIR} 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. @@ -207,8 +205,81 @@ prototipo \macro{EMFILE} e \macro{ENFILE}. \end{functions} +La funzione apre il file, usando il primo file descriptor libero, e crea +l'opportuna voce (cioè la struttura \var{file}) nella file table. Viene usato +sempre il file descriptor con il valore più basso, questa caratteritica +permette di prevedere qual'è il valore che si otterrà e viene talvolta usata +da alcune applicazioni per sostituire i file corrispondenti ai file standard +di \secref{sec:file_std_descr}: se ad esempio si chiude lo standard input e si +apre subito dopo un nuovo file questo diventerà il nuovo standard input (avrà +cioè il file descriptor 0). + +Il nuovo file descriptor non è condiviso con nessun altro processo, (torneremo +sulla condivisione dei file, in genere accessibile dopo una \func{fork}, in +\secref{sec:file_sharing}). Il nuovo file descriptor è settato di default per +restare aperto attraverso una \func{exec} (come accennato in +\secref{sec:proc_exec}) ed l'offset è settato all'inizio del file. + +La funzione prevede diverse modalità di apertura di un file, che vengono +specificate dal parametro \var{flags}, questo parametro viene settato come +maschera binaria attraverso OR aritmetico delle costanti che identificano i +vari flag. Questi ultimi sono poi divisibili in tre categorie principali: +\begin{itemize} +\item \textsl{le modalità di accesso}, che specificano con quale modalità si + accede al file: lettura, scrittura o lettura/scrittura. Uno di questi + valori deve essere sempre specificato, vengono settati alla chiamata da + \func{open}, e possono essere riletti con una \func{fcntl}, ma non + modificati. +\item \textsl{le modalità di apertura}, che permettono di specificare alcuni + dei modi di funzionamento di \func{open}. Hanno effetto solo al momento + della chiamata e non sono memorizzati nè possono essere riletti. +\item \textsl{le modalità di operazione}, che permettono di specificare alcuni + effetti del comportamento delle operazioni sul file (come la \func{read} o + la \func{write}). Sono settati alla chiamata da \func{open}, ma possono + essere riletti e modificati con una una \func{fcntl}. +\end{itemize} + +In \ntab\ si sono riportate, come definite in \file{fcntl.h}, le costanti che +identificano i vari flag di stato (ed i relativi valori numerici), da usare +per specificare il valore di \var{flags}, alcuni di questi poi andranno a +costituire lo stato del file (il cosiddetto \textit{file status flag}), tenuto +nel campo \var{f\_flags} di \var{file}. - +\begin{table}[htb] + \centering + \begin{tabular}[c]{|l|p{10cm}|} + \hline + \textbf{Flag} & \textbf{Descrizione} \\ + \hline + \hline % modailtà di accesso + \macro{O_RDONLY} & apre il file in sola lettura\\ + \macro{O_WRONLY} & apre il file in sola scrittura\\ + \macro{O_RDWR} & apre il file lettura/scrittura\\ + \hline % modalita di apertura + \macro{O_CREAT} & \\ + \macro{O_EXCL} & \\ + \macro{O_NOCTTY} & \\ + \macro{O_NONBLOCK} & \\ + \macro{O_SHLOCK} & \\ + \macro{O_EXLOCK} & \\ + \macro{O_TRUNC} & \\ + \macro{O_NOFOLLOW} & \\ + \macro{O_DIRECTORY} & \\ + \macro{O_LARGEFILE} & \\ + \hline % modalità di operazione + \macro{O_APPEND} & \\ + \macro{O_NONBLOCK} & \\ + \macro{O_NDELAY} & sinonimo di \macro{O_NONBLOCK}\\ + \macro{O_ASYNC} & \\ + \macro{O_FSYNC} & \\ + \macro{O_SYNC} & \\ + \macro{O_NOATIME} & \\ + \hline + \end{tabular} + \caption{Costanti che identificano i vari flag di stato del file specificati + alla sua aprertura tramite il parametro \var{flags} di \func{open}.} + \label{tab:file_open_flags} +\end{table} \subsection{La funzione \func{creat}} @@ -233,6 +304,15 @@ prototipo \subsection{La condivisione dei files} \label{sec:file_sharing} + +Si noti che i flag di stato del file, quelli settati dal parametro \var{flag} +di \func{open}, essendo tenuti nella vode sulla file table, vengono condivisi, +ai file sono però associati anche altri flag, (tenuti invece nella struttura +\var{file\_struct} interna alla process table) che sono unici per ciascun file +descriptor, e sono pertanto detti \textit{file descriptor flags} (l'unico +usato al momento è \macro{FD\_CLOEXEC}). + + \subsection{Operazioni atomiche coi file} \label{sec:file_atomic}