Si continua con l'open
[gapil.git] / fileunix.tex
index bc50b420f643e21720941096110ad5b3e583bc6f..95d27afda8f56b4f02831a705daf1b7a017634da 100644 (file)
@@ -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}