-L'argomento opzionale \param{mode} indica i permessi con cui il file viene
-creato ed i valori possibili sono gli stessi già visti in
-sez.~\ref{sec:file_perm_overview} e possono essere specificati come OR binario
-delle costanti descritte in tab.~\ref{tab:file_bit_perm}. Questi permessi sono
-filtrati dal valore di \itindex{umask} \textit{umask} (vedi
-sez.~\ref{sec:file_perm_management}) per il processo.
-
-La funzione prevede diverse opzioni, che vengono specificate usando vari bit
-dell'argomento \param{flags}. Alcuni di questi bit vanno anche a costituire
-il cosiddetto flag di stato del file (o \textit{file status flag}), che è
-mantenuto nel campo \var{f\_flags} della struttura \kstruct{file} (al solito
-si veda lo schema di fig.~\ref{fig:file_proc_file}). Essi sono divisi in tre
-categorie principali:
-\begin{itemize*}
-\item \textsl{i bit delle modalità di accesso}: specificano con quale modalità
- si accederà 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 impostati alla chiamata da \func{open}, e possono
- essere riletti con \func{fcntl} (fanno parte del \textit{file status flag}),
- ma non possono essere modificati.
-\begin{basedescript}{\desclabelwidth{2.cm}\desclabelstyle{\nextlinelabel}}
-\item[\const{O\_RDONLY}] Apre il file in sola lettura, le \acr{glibc}
- definiscono anche \const{O\_READ} come sinonimo.
-\item[\const{O\_WRONLY}] Apre il file in sola scrittura, le \acr{glibc}
- definiscono anche \const{O\_WRITE} come sinonimo.
-\item[\const{O\_RDWR}] Apre il file sia in lettura che in scrittura.
-\end{basedescript}
-\item \textsl{i bit delle modalità di operazione}: permettono di specificare
- alcune caratteristiche del comportamento delle future operazioni sul file
- (come \func{read} o \func{write}). Anch'essi fan parte del \textit{file
- status flag}. Il loro valore è impostato alla chiamata di \func{open}, ma
- possono essere riletti e modificati (insieme alle caratteristiche operative
- che controllano) con una \func{fcntl}.
-\begin{basedescript}{\desclabelwidth{2.cm}\desclabelstyle{\nextlinelabel}}
-
-\item[\const{O\_CREAT}] Se il file non esiste verrà creato, con le regole di
- titolarità del file viste in sez.~\ref{sec:file_ownership_management}. Con
- questa opzione l'argomento \param{mode} deve essere specificato.
-
-\item[\const{O\_EXCL}] Usato in congiunzione con \const{O\_CREAT} fa sì che la
- precedente esistenza del file diventi un errore\footnote{la pagina di
- manuale di \func{open} segnala che questa opzione è difettosa su NFS, e
- che i programmi che la usano per stabilire un \index{file!di lock}
- \textsl{file di lock} possono incorrere in una \itindex{race~condition}
- \textit{race condition}. Si consiglia come alternativa di usare un file
- con un nome univoco e la funzione \func{link} per verificarne l'esistenza
- (vedi sez.~\ref{sec:ipc_file_lock}).} che fa fallire \func{open} con
- \errcode{EEXIST}.
-
-\item[\const{O\_NONBLOCK}] Apre il file in modalità non bloccante, e comporta
- che \func{open} ritorni immediatamente anche quando dovrebbe bloccarsi
- (l'opzione ha senso solo per le fifo, vedi sez.~\ref{sec:ipc_named_pipe}).
-
-\item[\const{O\_NOCTTY}] Se \param{pathname} si riferisce ad un dispositivo di
- terminale, questo non diventerà il terminale di controllo, anche se il
- processo non ne ha ancora uno (si veda sez.~\ref{sec:sess_ctrl_term}).
-
-\item[\const{O\_SHLOCK}] Apre il file con uno shared lock (vedi
- sez.~\ref{sec:file_locking}). Specifica di BSD, assente in Linux.
-
-\item[\const{O\_EXLOCK}] Apre il file con un lock esclusivo (vedi
- sez.~\ref{sec:file_locking}). Specifica di BSD, assente in Linux.
-
-\item[\const{O\_TRUNC}] Se usato su un file di dati aperto in scrittura, ne
- tronca la lunghezza a zero; con un terminale o una fifo viene ignorato,
- negli altri casi il comportamento non è specificato.
-
-\item[\const{O\_NOFOLLOW}] Se \param{pathname} è un link simbolico la chiamata
- fallisce. Questa è un'estensione BSD aggiunta in Linux dal kernel
- 2.1.126. Nelle versioni precedenti i link simbolici sono sempre seguiti, e
- questa opzione è ignorata.
-
-\item[\const{O\_DIRECTORY}] Se \param{pathname} non è una directory la
- chiamata fallisce. Questo flag è specifico di Linux ed è stato introdotto
- con il kernel 2.1.126 per evitare dei \itindex{Denial~of~Service~(DoS)}
- \textit{DoS}\footnote{acronimo di \itindex{Denial~of~Service~(DoS)}
- \textit{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 dispositivo associato ad una unità a
- nastri, non deve dispositivo a nastri; non deve essere utilizzato
- al di fuori dell'implementazione di \func{opendir}.
-
-\item[\const{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.
-\end{basedescript}
-\item \textsl{i bit delle modalità di apertura}: permettono di specificare
- alcune delle caratteristiche del comportamento di \func{open} quando viene
- eseguita. Hanno effetto solo al momento della chiamata della funzione e non
- sono memorizzati né possono essere riletti.
-\begin{basedescript}{\desclabelwidth{2.cm}\desclabelstyle{\nextlinelabel}}
-
-\item[\const{O\_APPEND}] Il file viene aperto in \itindex{append~mode}
- \textit{append mode}. Prima di ciascuna scrittura la posizione corrente
- viene sempre impostata alla fine del file. Con NFS si può avere una
- corruzione del file se più di un processo scrive allo stesso
- tempo.\footnote{il problema è che NFS non supporta la scrittura in
- \itindex{append~mode} \textit{append}, ed il kernel deve simularla, ma
- questo comporta la possibilità di una \itindex{race~condition}
- \textit{race condition}, vedi sez.~\ref{sec:file_atomic}.}
-
-\item[\const{O\_NONBLOCK}] Il file viene aperto in modalità non bloccante per
- le operazioni di I/O (che tratteremo in sez.~\ref{sec:file_noblocking}):
- questo significa il fallimento di \func{read} in assenza di dati da leggere
- e quello di \func{write} in caso di impossibilità di scrivere
- immediatamente. Questa modalità ha senso solo per le fifo e per alcuni file
- di dispositivo.
-
-\item[\const{O\_NDELAY}] In Linux è sinonimo di
- \const{O\_NONBLOCK}.\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 un'ambiguità, dato che come vedremo in
- sez.~\ref{sec:file_read} il ritorno di zero da parte di \func{read} ha il
- significato di una \textit{end-of-file}.}
-
-\item[\const{O\_ASYNC}] Apre il file per l'I/O in modalità asincrona (vedi
- sez.~\ref{sec:file_asyncronous_io}). Quando è impostato viene generato il
- segnale \signal{SIGIO} tutte le volte che sono disponibili dati in input sul
- file.
-
-\item[\const{O\_SYNC}] Apre il file per l'input/output sincrono: ogni
- \func{write} bloccherà fino al completamento della scrittura di tutti i dati
- sull'hardware sottostante.
-
-\item[\const{O\_FSYNC}] Sinonimo di \const{O\_SYNC}, usato da BSD.
-
-\item[\const{O\_DSYNC}] Variante di I/O sincrono definita da POSIX; presente
- dal kernel 2.1.130 come sinonimo di \const{O\_SYNC}.
-
-\item[\const{O\_RSYNC}] Variante analoga alla precedente, trattata allo stesso
- modo.
-
-\item[\const{O\_NOATIME}] Blocca l'aggiornamento dei tempi di accesso dei file
- (vedi sez.~\ref{sec:file_file_times}). Per molti filesystem questa
- funzionalità non è disponibile per il singolo file ma come opzione generale
- da specificare in fase di montaggio.
-
-\item[\const{O\_DIRECT}] Esegue l'I/O direttamente dai buffer in user space in
- maniera sincrona, in modo da scavalcare i meccanismi di caching del
- kernel. In genere questo peggiora le prestazioni tranne quando le
- applicazioni ottimizzano il proprio caching.\footnote{l'opzione è stata
- introdotta dalla SGI in IRIX, e serve sostanzialmente a permettere ad
- alcuni programmi (in genere database) la gestione diretta della
- bufferizzazione dell'I/O in quanto essi sono in grado di ottimizzarla al
- meglio per le loro prestazioni; l'opzione è presente anche in FreeBSD,
- senza limiti di allineamento dei buffer. In Linux è stata introdotta con
- il kernel 2.4.10, le versioni precedenti la ignorano.} Per i kernel della
- serie 2.4 si deve garantire che i buffer in user space siano allineati alle
- dimensioni dei blocchi del filesystem; per il kernel 2.6 basta che siano
- allineati a multipli di 512 byte.
-
-\item[\const{O\_CLOEXEC}] Attiva la modalità di \itindex{close-on-exec}
- \textit{close-on-exec} (vedi sez.~\ref{sec:file_sharing} e
- \ref{sec:file_fcntl}).\footnote{introdotto con il kernel 2.6.23, per evitare
- una \itindex{race~condition} \textit{race condition} che si può verificare
- con i \itindex{thread} \textit{thread}, fra l'apertura del file e
- l'impostazione della suddetta modalità con \func{fcntl}.}
-\end{basedescript}
-\end{itemize*}
+\begin{table}[htb]
+ \centering
+ \footnotesize
+ \begin{tabular}[c]{|l|l|}
+ \hline
+ \textbf{Flag} & \textbf{Significato} \\
+ \hline
+ \hline
+ \constd{O\_RDONLY} & Apre il file in sola lettura.\\
+ \constd{O\_WRONLY} & Apre il file in sola scrittura.\\
+ \constd{O\_RDWR} & Apre il file sia in lettura che in scrittura.\\
+ \hline
+ \end{tabular}
+ \caption{Le tre costanti che identificano le modalità di accesso
+ nell'apertura di un file.}
+ \label{tab:open_access_mode_flag}
+\end{table}
+
+A differenza di tutti gli altri flag che vedremo in seguito, in questo caso
+non si ha a che fare con singoli bit separati dell'argomento \param{flags}, ma
+con un numero composto da due bit. Questo significa ad esempio che la
+combinazione \code{\const{O\_RDONLY}|\const{O\_WRONLY}} non è affatto
+equivalente a \const{O\_RDWR}, e non deve essere usata.\footnote{in realtà
+ su Linux, dove i valori per le tre costanti di
+ tab.~\ref{tab:open_access_mode_flag} sono rispettivamente $0$, $1$ e $2$, il
+ valore $3$ viene usato con un significato speciale, ed assolutamente fuori
+ standard, disponibile solo per i file di dispositivo e solo per alcuni
+ driver, in cui si richiede la verifica della capacità di accesso in lettura
+ e scrittura ma viene restituito un file descriptor che non può essere letto
+ o scritto, ma solo usato con una \func{ioctl} (vedi
+ sez.~\ref{sec:file_fcntl_ioctl}).}
+
+La modalità di accesso deve sempre essere specificata quando si apre un file,
+il valore indicato in \param{flags} viene salvato nei \textit{file status
+ flags}, e può essere riletto con \func{fcntl} (vedi
+sez.~\ref{sec:file_fcntl_ioctl}), il relativo valore può essere poi ottenuto
+un AND aritmetico della maschera binaria \constd{O\_ACCMODE}, ma non può essere
+modificato. Nella \acr{glibc} sono definite inoltre \constd{O\_READ} come
+sinonimo di \const{O\_RDONLY} e \constd{O\_WRITE} come sinonimo di
+\const{O\_WRONLY}.\footnote{si tratta di definizioni completamente fuori
+ standard, attinenti, insieme a \constd{O\_EXEC} che permetterebbe l'apertura
+ di un file per l'esecuzione, ad un non meglio precisato ``\textit{GNU
+ system}''; pur essendo equivalenti alle definizioni classiche non è
+ comunque il caso di utilizzarle.}
+
+\itindend{file~status~flag}
+
+Il secondo gruppo di flag è quello delle \textsl{modalità di
+ apertura},\footnote{la pagina di manuale di \func{open} parla di
+ \textit{file creation flags}, ma alcuni di questi flag non hanno nulla a che
+ fare con la creazione dei file, mentre il manuale dalla \acr{glibc} parla di
+ più correttamente di \textit{open-time flags}, dato che si tratta di flag il
+ cui significato ha senso solo al momento dell'apertura del file.} che
+permettono di specificare alcune delle caratteristiche del comportamento di
+\func{open} nel momento in viene eseguita per aprire un file. Questi flag
+hanno effetto solo nella chiamata della funzione, non sono memorizzati fra i
+\textit{file status flags} e non possono essere riletti da \func{fcntl} (vedi
+sez.~\ref{sec:file_fcntl_ioctl}).