-La seconda categoria è quella dei \textsl{ bit delle modalità di operazione},
-che 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\_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 collegamento simbolico
- la chiamata fallisce. Questa è un'estensione BSD aggiunta in Linux dal
- kernel 2.1.126. Nelle versioni precedenti i collegamenti 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}
+\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}).
+
+\begin{table}[htb]
+ \centering
+ \footnotesize
+ \begin{tabular}[c]{|l|p{10 cm}|}
+ \hline
+ \textbf{Flag} & \textbf{Significato} \\
+ \hline
+ \hline
+ \constd{O\_CREAT} & Se il file non esiste verrà creato, con le regole
+ di titolarità del file viste in
+ sez.~\ref{sec:file_ownership_management}. Se si
+ imposta questo flag l'argomento \param{mode} deve
+ essere sempre specificato.\\
+ \constd{O\_DIRECTORY}&Se \param{pathname} non è una directory la
+ chiamata fallisce. Questo flag, introdotto con il
+ kernel 2.1.126, è specifico di Linux e
+ serve ad evitare dei possibili
+ \itindex{Denial~of~Service~(DoS)}
+ \textit{DoS}\footnotemark quando \func{opendir}
+ viene chiamata su una \textit{fifo} o su un dispositivo
+ associato ad una unità a nastri. Non viene
+ usato al di fuori dell'implementazione di
+ \func{opendir}, ed è utilizzabile soltanto se si è
+ definita la macro \macro{\_GNU\_SOURCE}.\\
+ \constd{O\_EXCL} & Deve essere usato in congiunzione con
+ \const{O\_CREAT} ed in tal caso impone che il file
+ indicato da \param{pathname} non sia già esistente
+ (altrimenti causa il fallimento della chiamata con
+ un errore di \errcode{EEXIST}).\\
+ \constd{O\_LARGEFILE}&Viene usato sui sistemi a 32 bit per richiedere
+ l'apertura di file molto grandi, la cui
+ dimensione non è rappresentabile con la versione a
+ 32 bit del tipo \type{off\_t}, utilizzando
+ l'interfaccia alternativa abilitata con la
+ macro \macro{\_LARGEFILE64\_SOURCE}. Come
+ illustrato in sez.~\ref{sec:intro_gcc_glibc_std} è
+ sempre preferibile usare la conversione automatica
+ delle funzioni che si attiva assegnando a $64$ la
+ macro \macro{\_FILE\_OFFSET\_BITS}, e non usare mai
+ questo flag.\\
+ \constd{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}).\\
+ \constd{O\_NOFOLLOW}& Se \param{pathname} è un collegamento simbolico
+ la chiamata fallisce. Questa è un'estensione BSD
+ aggiunta in Linux a partire dal kernel
+ 2.1.126, ed utilizzabile soltanto se si è definita
+ la macro \macro{\_GNU\_SOURCE}.\\
+ \constd{O\_TRUNC} & Se usato su un file di dati aperto in scrittura,
+ ne tronca la lunghezza a zero; con un terminale o
+ una \textit{fifo} viene ignorato, negli altri casi il
+ comportamento non è specificato.\\
+ \hline
+ \end{tabular}
+ \caption{Le costanti che identificano le \textit{modalità di apertura} di
+ un file.}
+ \label{tab:open_time_flag}
+\end{table}
+
+
+% TODO: aggiungere O_TMPFILE per la creazione di file temporanei senza che
+% questi appaiano sul filesystem, introdotto con il 3.11, vedi:
+% https://lwn.net/Articles/556512/, http://kernelnewbies.org/Linux_3.11
+% https://lwn.net/Articles/558598/ http://lwn.net/Articles/619146/
+
+\footnotetext{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.}
+
+Si è riportato in tab.~\ref{tab:open_time_flag} l'elenco dei flag delle
+\textsl{modalità di apertura}.\footnote{la \acr{glibc} definisce anche i due
+ flag \constd{O\_SHLOCK}, che aprirebbe il file con uno \textit{shared lock} e
+ \constd{O\_EXLOCK} che lo aprirebbe con un \textit{exclusive lock} (vedi
+ sez.~\ref{sec:file_locking}, si tratta di opzioni specifiche di BSD, che non
+ esistono con Linux.} Uno di questi, \const{O\_EXCL}, ha senso solo se usato
+in combinazione a \const{O\_CREAT} quando si vuole creare un nuovo file per
+assicurarsi che questo non esista di già, e lo si usa spesso per creare i
+cosiddetti ``\textsl{file di lock}'' (vedi sez.~\ref{sec:ipc_file_lock}). Si
+tenga presente che questa opzione è supportata su NFS solo a partire da NFSv3
+e con il kernel 2.6, nelle versioni precedenti la funzionalità viene emulata
+controllando prima l'esistenza del file per cui usarla per creare un file di
+lock potrebbe dar luogo a una \textit{race condition}.\footnote{un file
+ potrebbe venir creato fra il controllo la successiva apertura con
+ \const{O\_CREAT}, la cosa si può risolvere comunque creando un file con un
+ nome univoco ed usando la funzione \func{link} per creare il file di lock,
+ (vedi sez.~\ref{sec:ipc_file_lock}).}
+
+Se si usa \const{O\_EXCL} senza \const{O\_CREAT} il comportamento è
+indefinito. Nella creazione di un file con \const{O\_CREAT} occorre sempre
+specificare l'argomento di \param{mode}, che altrimenti è ignorato. Si tenga
+presente che indipendentemente dai permessi che si possono assegnare, che in
+seguito potrebbero non consentire lettura o scrittura, quando il file viene
+aperto l'accesso viene garantito secondo quanto richiesto con i flag di
+tab.~\ref{tab:open_access_mode_flag}. Quando viene creato un nuovo file
+\const{O\_CREAT} con tutti e tre i tempi del file di
+tab.~\ref{tab:file_file_times} vengono impostati al tempo corrente. Se invece
+si tronca il file con \const{O\_TRUNC} verranno impostati soltanto il
+\textit{modification time} e lo \textit{status change time}.
+
+\begin{table}[!htb]
+ \centering
+ \footnotesize
+ \begin{tabular}[c]{|l|p{10 cm}|}
+ \hline
+ \textbf{Flag} & \textbf{Significato} \\
+ \hline
+ \hline
+ \constd{O\_APPEND} & Il file viene aperto in \textit{append mode}. La
+ posizione sul file (vedi sez.~\ref{sec:file_lseek})
+ viene sempre mantenuta sulla sua coda, per cui
+ quanto si scrive viene sempre aggiunto al contenuto
+ precedente. Con NFS questa funzionalità non è
+ supportata e viene emulata, per questo possono
+ verificarsi \textit{race condition} con una
+ sovrapposizione dei dati se più di un processo
+ scrive allo stesso tempo.\\
+ \constd{O\_ASYNC} & Apre il file per l'I/O in modalità asincrona (vedi
+ sez.~\ref{sec:signal_driven_io}). Quando è
+ impostato viene generato il segnale \signal{SIGIO}
+ tutte le volte che il file è pronto per le
+ operazioni di lettura o scrittura. Questo flag si
+ può usare solo terminali, pseudo-terminali e socket
+ e, a partire dal kernel 2.6, anche sulle \textit{fifo}. Per
+ un bug dell'implementazione non è opportuno usarlo
+ in fase di apertura del file, deve
+ invece essere attivato successivamente con
+ \func{fcntl}.\\
+ \constd{O\_CLOEXEC}& Attiva la modalità di \textit{close-on-exec} (vedi
+ sez.~\ref{sec:proc_exec}) sul file. Il flag è
+ previsto dallo standard POSIX.1-2008, ed è stato
+ introdotto con il kernel 2.6.23 per evitare una
+ \textit{race condition} che si potrebbe verificare
+ con i \textit{thread} fra l'apertura del file e
+ l'impostazione della suddetta modalità con
+ \func{fcntl} (vedi
+ sez.~\ref{sec:file_fcntl_ioctl}).\\
+ \constd{O\_DIRECT} & Esegue l'I/O direttamente dalla memoria in
+ \textit{user space} in maniera sincrona, in modo da
+ scavalcare i meccanismi di bufferizzazione del
+ kernel. Introdotto con il kernel 2.4.10 ed
+ utilizzabile soltanto se si è definita la
+ macro \macro{\_GNU\_SOURCE}.\\
+ \constd{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. Introdotto con il kernel 2.6.8 ed
+ utilizzabile soltanto se si è definita la
+ macro \macro{\_GNU\_SOURCE}.\\
+ \constd{O\_NONBLOCK}&Apre il file in \textsl{modalità non bloccante} per
+ le operazioni di I/O (vedi
+ sez.~\ref{sec:file_noblocking}). Questo significa
+ il fallimento delle successive operazioni di
+ lettura o scrittura qualora il file non sia pronto
+ per la loro esecuzione immediata, invece del
+ blocco delle stesse in attesa di una successiva
+ possibilità di esecuzione come avviene
+ normalmente. Questa modalità ha senso solo per le
+ \textit{fifo}, vedi sez.~\ref{sec:ipc_named_pipe}), o quando
+ si vuole aprire un file di dispositivo per eseguire
+ una \func{ioctl} (vedi
+ sez.~\ref{sec:file_fcntl_ioctl}).\\
+ \constd{O\_NDELAY} & In Linux è un sinonimo di \const{O\_NONBLOCK}, ma
+ 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 un valore nullo da parte di \func{read} ha
+ il significato di una \textit{end-of-file}.\\
+ \constd{O\_SYNC} & Apre il file per l'input/output sincrono. Ogni
+ scrittura si bloccherà fino alla conferma
+ dell'arrivo di tutti i dati e di tutti i metadati
+ sull'hardware sottostante (in questo significato
+ solo dal kernel 2.6.33).\\
+ \constd{O\_DSYNC} & Apre il file per l'input/output sincrono. Ogni
+ scrittura di dati si bloccherà fino alla conferma
+ dell'arrivo degli stessi e della parte di metadati
+ ad essi relativa sull'hardware sottostante (in
+ questo significato solo dal kernel 2.6.33).\\
+ \hline
+ \end{tabular}
+ \caption{Le costanti che identificano le \textit{modalità di operazione} di
+ un file.}
+ \label{tab:open_operation_flag}
+\end{table}