Completata (rozzamente) open, creato nuovo capito sull'I/O avanzato (con
[gapil.git] / fileunix.tex
index 077c659981f1900dbfda561dc88cd97d34adceb7..9f021143a7980fc473137d7a8ea88bd540987dd6 100644 (file)
@@ -218,46 +218,59 @@ Il nuovo file descriptor non 
 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:
+\secref{sec:proc_exec}) ed l'offset è settato all'inizio del file. 
+
+Il parametro \var{mode} specifica i permessi con cui il file viene
+eventualmente creato; i valori possibili gli stessi già visti in
+\secref{sec:file_perm_overview} e possono essere specificati come OR binario
+delle costanti descritte in \tabref{tab:file_bit_perm}. Questi permessi
+filtrati dal valore di \file{umask} per il processo.
+
+La funzione prevede diverse opzioni, che vengono specificate usando vari bit
+del parametro \var{flags}.  Alcuni di questi vanno anche a costituire lo il
+flag di stato del file (o \textit{file status flag}), che è mantenuto nel
+campo \var{f\_flags} della struttura \var{file} (vedi \curfig).  Questi
+bit sono divisi 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}.
+\item \textsl{i bit delle modalità di accesso}: specificano con quale modalità
+  si accede al file: i valori possibili sono lettura, scrittura o
+  lettura/scrittura.  Uno di questi bit deve essere sempre specificato quando
+  si apre un file.  Vengono settati alla chiamata da \func{open}, e possono
+  essere riletti con una \func{fcntl} (fanno parte del \textit{file status
+    flag}), ma non modificati.
+\item \textsl{i bit delle modalità di apertura}: permettono di specificare
+  alcuni dei modi di funzionamento di \func{open}. Hanno effetto solo al
+  momento della chiamata della funzione e non sono memorizzati nè possono
+  essere riletti.
+\item \textsl{i bit delle modalità di operazione}: permettono di specificare
+  alcuni effetti validi anche in seguito per il comportamento delle operazioni
+  sul file (come la \func{read} o la \func{write}). Anch'essi fanno parte del
+  \textit{file status flag}. Il loro valore è settato alla chiamata di
+  \func{open}, ma possono essere riletti e modificati con 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}.  
+In \ntab\ si sono riportate, ordinate e divise fra loro secondo le tre
+modalità appena elencate, le costanti che identificano i vari bit, queste
+possono essere combinate con un OR aritmetico per costruire il valore del
+parametro \var{flags} da passare alla \func{open} per specificarne il
+comportamento.
 
-\begin{table}[htb]
+\begin{table}[!htbp]
   \centering
-  \begin{tabular}[c]{|l|p{10cm}|}
+  \footnotesize
+  \begin{tabular}[c]{|l|p{12cm}|}
     \hline
     \textbf{Flag} & \textbf{Descrizione} \\
     \hline
-    \hline % modailtà di accesso
+    \hline % modailtà di accesso al file
     \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} & Se il file non esiste verrà creato, con le regole di
-    titolarità del file viste in \secref{sec:file_ownership}.  \\
+    \hline % modalita di apertura del file
+    \hline
+    \macro{O\_CREAT} & se il file non esiste verrà creato, con le regole di
+    titolarità del file viste in \secref{sec:file_ownership}. Il parametro
+    \var{mode} deve essere specificato. \\
     \macro{O\_EXCL} & usato in congiunzione con \macro{O\_CREAT} fa sì che
     l'esistenza del file diventi un errore\footnote{la man page di \func{open}
     segnala che questa opzione è difettosa su NFS, e che i programmi che la
@@ -265,38 +278,86 @@ nel campo \var{f\_flags} di \var{file}.
     condition.  Si consiglia come alternativa di usare un file con un nome
     univoco e la funzione \func{link} per verificarne l'esistenza.} che fa
     fallire \func{open} con \macro{EEXIST}.\\
-    \macro{O\_NOCTTY} & Se \var{pathname} si riferisce ad un device di
+    \macro{O\_NONBLOCK} & apre il file in modalità non bloccante. Questo
+    valore specifica anche una modalità di operazione (vedi sotto), e 
+    comporta che \func{open} ritorni immediatamente (torneremo su
+    questo in \secref{sec:file_noblocking}).  \\
+    \macro{O\_NOCTTY} & se \var{pathname} si riferisce ad un device di
     terminale, questo non diventerà il terminale di controllo, anche se il
     processo non ne ha ancora uno (si veda \secref{sec:sess_xxx}).\\
-    \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} & Apre il file in modalità non bloccante, questo
-    comporta che \func{open} ritorna immediatamente anche nei casi in cui si
-    sarebbe bloccata. inoltre tutte le operazioni di I/O successive restano
-    in modalità non bloccante, il che significa il fallimento di una
-    \func{read} in assenza di dati da leggere e quello di una \func{write} in
-    caso di impossibilità di scrivere immediatamente.  \\
-    \macro{O\_NDELAY} & sinonimo di \macro{O\_NONBLOCK}\\
-    \macro{O\_ASYNC} & \\
+    \macro{O\_SHLOCK} & opzione di BSD, acquisisce uno shared lock (vedi
+    \secref{sec:file_locking}) sul file. Non è disponibile in Linux.\\
+    \macro{O\_EXLOCK} & opzione di BSD, acquisisce uno lock esclusivo (vedi
+    \secref{sec:file_locking}) sul file. Non è disponibile in Linux.\\
+    \macro{O\_TRUNC} & se il file esiste ed è un file di dati e la modalità di
+    apertura consente la scrittura, allora la sua lunghezza verrà troncata a
+    zero. Se il file è un terminale o una fifo il flag verrà ignorato, negli
+    altri casi il comportamento non è specificato.\\
+    \macro{O\_NOFOLLOW} & se \var{pathname} è un link simbolico la chiamata
+    fallisce. Questa è una estensione BSD aggiunta in Linux dal kernel 2.1.126.
+    Nelle versioni precedenti i link simbolici sono sempre seguiti, e questa
+    opzione è ignorata.\\
+    \macro{O\_DIRECTORY} & se \var{pathname} non è una directory la chiamata
+    fallisce. Questo flag è specifico di Linux ed è stato introdotto con il
+    kernel 2.1.126 per evitare dei DoS\footnote{Denial of Service, si chiamano
+    così attacchi miranti ad impedire un servizio causando una qualche forma
+    di carico eccessivo per il sistema, che resta bloccato nelle risposte
+    all'attacco} quando \func{opendir} viene chiamata su una fifo o su un
+    device di unità a nastri, non deve essere utilizzato al di fuori
+    dell'implementazione di \func{opendir}. \\
+    \macro{O\_LARGEFILE} & nel caso di sistemi a 32 bit che supportano file di
+    grandi dimensioni consente di aprire file le cui dimensioni non possono
+    essere rappresentate da numeri a 31 bit.\\
+    \hline
+    \hline  % modalità di operazione col file
+    \macro{O\_APPEND} & il file viene aperto in append mode. Prima di ciascuna
+    scrittura la posizione corrente viene sempre settata alla fine del
+    file. Può causare corruzione del file con NFS se più di un processo scrive
+    allo stesso tempo\footnote{il problema è che NFS non supporta la scrittura
+    in append, ed il kernel deve simularla, ma questo comporta la possibilità
+    di una race condition}.\\
+    \macro{O\_NONBLOCK} & il file viene aperto in modalità non bloccante per
+    le operazioni di I/O: questo significa il fallimento di una \func{read} in
+    assenza di dati da leggere e quello di una \func{write} in caso di 
+    impossibilità di scrivere immediatamente. L'opzione è effettiva solo per
+    le fifo e per alcuni file di dispositivo. \\
+    \macro{O\_NDELAY} & in Linux\footnote{l'opzione origina da SVr4, dove però
+    causava il ritorno da una \func{read} con un valore nullo e non con un
+    errore, questo introduce una ambiguità, dato che come vedremo in
+    \secref{sec:file_read} il ritorno di zero da parte di \func{read} ha il
+    significato di una end-of-file} è sinonimo di \macro{O\_NONBLOCK}\\
+    \macro{O\_ASYNC} & apre il file per l'input/output in modalità
+    asincrona. Non è supportato in Linux. \\
     \macro{O\_FSYNC} & \\
-    \macro{O\_SYNC} & \\
-    \macro{O\_NOATIME} & \\
+    \macro{O\_SYNC} & apre il file per l'input/output sincrono, ogni
+    \func{write} bloccherà fino al completamento della scrittura di tutti dati
+    sul sull'hardware sottostante\\
+    \macro{O\_NOATIME} & blocca l'aggiornamento dei tempi dei di accesso dei
+    file (vedi \secref{sec:file_file_times}). In Linux questa opzione non è
+    disponibile per il singolo file ma come opzione per il filesystem in fase
+    di montaggio.\\
     \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}.}
+  \caption{Costanti definite in \file{fcntl.h} per indicare i vari bit 
+    usabili per il specificare parametro \var{flags} di \func{open}.}
   \label{tab:file_open_flags}
 \end{table}
 
+Nelle prime versioni di unix i flag specificabili per \func{open} erano solo
+quelli delle modalità di apertura. Per questo motivo per creare un file c'era
+una system call apposita, \func{creat}, il cui prototipo è:
+
+\begin{prototype}{fcntl.h}
+  {int creat(const char *pathname, mode\_t mode)}
+  Crea un nuovo file vuoto, con i permessi specificati da \var{mode}. É del
+  tutto equivalente a \func{open(filedes, O\_CREAT|O\_WRONLY|O\_TRUNC, mode)}. 
+\end{prototype}
+
+adesso questa funzione resta solo per compatibilità con i vecchi programmi.
+
+
+
 
-\subsection{La funzione \func{creat}}
-\label{sec:file_creat}
 
 \subsection{La funzione \func{close}}
 \label{sec:file_close}