+\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}, in tal caso
+infatti 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, escluso il caso in cui viene usato con \const{O\_TMPFILE} su cui
+torneremo più avanti; un'altra eccezione è quello in cui lo si usa da solo su
+un file di dispositivo, in quel caso se questo è in uso (ad esempio se è
+relativo ad un filesystem che si è montato) si avrà un errore di
+\errval{EBUSY}, e pertanto può essere usato in questa modalità per rilevare lo
+stato del dispositivo.
+
+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}.
+
+Il flag \constd{O\_TMPFILE}, introdotto con il kernel
+3.11,\footnote{inizialmente solo su alcuni filesystem (i vari \acr{extN},
+ \acr{Minix}, \acr{UDF}, \acr{shmem}) poi progressivamente esteso ad altri
+ (\acr{XFS} con il 3.15, \acr{Btrfs} e \acr{F2FS} con il 3.16, \acr{ubifs}
+ con il 4.9).} consente di aprire un file temporaneo senza che questo venga
+associato ad un nome e compaia nel filesystem. In questo caso la funzione
+restituirà un file descriptor da poter utilizzare per leggere e scrivere dati,
+ma il contenuto dell'argomento \param{path} verrà usato solamente per
+determinare, in base alla directory su cui si verrebbe a trovare il
+\textit{pathname} indicato, il filesystem all'interno del quale deve essere
+allocato l'\textit{inode} e lo spazio disco usato dal file
+descriptor. L'\textit{inode} resterà anonimo e l'unico riferimento esistente
+sarà quello contenuto nella \textit{file table} del processo che ha chiamato
+\func{open}.
+
+Lo scopo principale del flag è quello fornire una modalità atomica, semplice e
+sicura per applicare la tecnica della creazione di un file temporaneo seguita
+dalla sua immediata cancellazione con \func{unlink} per non lasciare rimasugli
+sul filesystem, di cui è parlato in sez.~\ref{sec:link_symlink_rename}.
+Inoltre, dato che il file non compare nel filesystem, si evitano alla radice
+tutti gli eventuali problemi di \textit{race condition} o \textit{symlink
+ attack} e non ci si deve neanche preoccupare di ottenere un opportuno nome
+univoco con l'uso delle funzioni di sez.~\ref{sec:file_temp_file}.
+
+Una volta aperto il file vi si potrà leggere o scrivere a seconda che siano
+utilizzati \const{O\_RDWR} o \const{O\_WRONLY}, mentre l'uso di
+\func{O\_RDONLY} non è consentito, non avendo molto senso ottenere un file
+descriptor su un file che nasce vuoto per cui non si potrà comunque leggere
+nulla. L'unico altro flag che può essere utilizzato insieme a
+\const{O\_TMPFILE} è \const{O\_EXCL}, che in questo caso assume però un
+significato diverso da quello ordinario, dato che in questo caso il file
+associato al file descriptor non esiste comunque.
+
+L'uso di \const{O\_EXCL} attiene infatti all'altro possibile impiego di
+\const{O\_TMPFILE} oltre a quello citato della creazione sicura di un file
+temporaneo come sostituto sicuro di \func{tmpfile}: la possibilità di creare
+un contenuto iniziale per un file ed impostarne permessi, proprietario e
+attributi estesi con \func{fchmod}, \func{fchown} e \func{fsetxattr}, senza
+possibilità di \textit{race condition} ed interferenze esterne, per poi far
+apparire il tutto sul filesystem in un secondo tempo utilizzando \func{linkat}
+sul file descriptor (torneremo su questo in sez.~\ref{sec:file_openat}) per
+dargli un nome. Questa operazione però non sarà possibile se si è usato
+\const{O\_EXCL}, che in questo caso viene ad assumere il significato di
+escludere la possibilità di far esistere il file anche in un secondo tempo.
+
+% NOTE: per O_TMPFILE vedi: http://kernelnewbies.org/Linux_3.11
+% https://lwn.net/Articles/558598/ http://lwn.net/Articles/619146/
+
+
+\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}).\\
+ \const{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}.\\
+ \const{O\_PATH} & Ottiene un file descriptor io cui uso è limitato
+ all'indicare una posizione sul filesystem o
+ eseguire operazioni che operano solo a livello del
+ file descriptor (e non di accesso al contenuto del
+ file). Introdotto con il kernel 2.6.39, è specifico
+ di Linux.\\
+ \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}
+
+Il terzo gruppo è quello dei flag delle \textsl{modalità di operazione},
+riportati in tab.~\ref{tab:open_operation_flag}, che permettono di specificare
+varie caratteristiche del comportamento delle operazioni di I/O che verranno
+eseguite sul file o le modalità in cui lo si potrà utilizzare. Tutti questi,
+tranne \const{O\_CLOEXEC}, che viene mantenuto per ogni singolo file
+descriptor, vengono salvati nel campo \var{f\_flags} della struttura
+\kstruct{file} insieme al valore della \textsl{modalità di accesso}, andando
+far parte dei \textit{file status flags}. Il loro valore viene impostato alla
+chiamata di \func{open}, ma possono venire riletti in un secondo tempo con
+\func{fcntl}, inoltre alcuni di essi possono anche essere modificati tramite
+questa funzione, con conseguente effetto sulle caratteristiche operative che
+controllano (torneremo sull'argomento in sez.~\ref{sec:file_fcntl_ioctl}).
+
+Il flag \const{O\_ASYNC} (che, per compatibilità con BSD, si può indicare
+anche con la costante \constd{FASYNC}) è definito come possibile valore per
+\func{open}, ma per un bug dell'implementazione,\footnote{segnalato come
+ ancora presente nella pagina di manuale, almeno fino al novembre 2018.} non
+solo non attiva il comportamento citato, ma se usato richiede di essere
+esplicitamente disattivato prima di essere attivato in maniera effettiva con
+l'uso di \func{fcntl}. Per questo motivo, non essendovi nessuna necessità
+specifica di definirlo in fase di apertura del file, è sempre opportuno
+attivarlo in un secondo tempo con \func{fcntl} (vedi
+sez.~\ref{sec:file_fcntl_ioctl}).
+
+Il flag \constd{O\_DIRECT} non è previsto da nessuno standard, anche se è
+presente in alcuni kernel unix-like.\footnote{il flag è stato introdotto dalla
+ SGI in IRIX, ma è presente senza limiti di allineamento dei buffer anche in
+ FreeBSD.} Per i kernel della serie 2.4 si deve garantire che i buffer in
+\textit{user space} da cui si effettua il trasferimento diretto dei dati siano
+allineati alle dimensioni dei blocchi del filesystem. Con il kernel 2.6 in
+genere basta che siano allineati a multipli di 512 byte, ma le restrizioni
+possono variare a seconda del filesystem, ed inoltre su alcuni filesystem
+questo flag può non essere supportato, nel qual caso si avrà un errore di
+\errval{EINVAL}.
+
+Lo scopo di \const{O\_DIRECT} è consentire un completo controllo sulla
+bufferizzazione dei propri dati per quelle applicazioni (in genere database)
+che hanno esigenze specifiche che non vengono soddisfatte nella maniera più
+efficiente dalla politica generica utilizzata dal kernel. In genere l'uso di
+questo flag peggiora le prestazioni tranne quando le applicazioni sono in
+grado di ottimizzare la propria bufferizzazione in maniera adeguata. Se lo si
+usa si deve avere cura di non mescolare questo tipo di accesso con quello
+ordinario, in quante le esigenze di mantenere coerenti i dati porterebbero ad
+un peggioramento delle prestazioni. Lo stesso dicasi per l'interazione con
+eventuale mappatura in memoria del file (vedi sez.~\ref{sec:file_memory_map}).
+
+Si tenga presente infine che anche se l'uso di \const{O\_DIRECT} comporta una
+scrittura sincrona dei dati dei buffer in \textit{user space}, questo non è
+completamente equivalente all'uso di \const{O\_SYNC} che garantisce anche
+sulla scrittura sincrona dei metadati associati alla scrittura dei dati del
+file.\footnote{la situazione si complica ulteriormente per NFS, in cui l'uso
+ del flag disabilita la bufferizzazione solo dal lato del client, e può
+ causare problemi di prestazioni.} Per questo in genere se si usa
+\const{O\_DIRECT} è opportuno richiedere anche \const{O\_SYNC}.
+
+Si tenga presente infine che la implementazione di \const{O\_SYNC} di Linux
+differisce da quanto previsto dallo standard POSIX.1 che prevede, oltre a
+questo flag che dovrebbe indicare la sincronizzazione completa di tutti i dati
+e di tutti i metadati, altri due flag \const{O\_DSYNC} e \const{O\_RSYNC}.
+
+Il primo dei due richiede la scrittura sincrona di tutti i dati del file e dei
+metadati che ne consentono l'immediata rilettura, ma non di tutti i metadati,
+per evitare la perdita di prestazioni relativa alla sincronizzazione di
+informazioni ausiliarie come i tempi dei file. Il secondo, da usare in
+combinazione con \const{O\_SYNC} o \const{O\_DSYNC} ne sospende l'effetto,
+consentendo al kernel di bufferizzare le scritture, ma soltanto finché non
+avviene una lettura, in quel caso i dati ed i metadati dovranno essere
+sincronizzati immediatamente (secondo le modalità indicate da \const{O\_SYNC}
+e \const{O\_DSYNC}) e la lettura verrà bloccata fintanto che detta
+sincronizzazione non sia completata.
+
+Nel caso di Linux, fino al kernel 2.6.33, esisteva solo \const{O\_SYNC}, ma
+con il comportamento previsto dallo standard per \const{O\_DSYNC}, e sia
+questo che \const{O\_RSYNC} erano definiti (fin dal kernel 2.1.130) come
+sinonimi di \const{O\_SYNC}. Con il kernel 2.6.33 il significato di
+\const{O\_SYNC} è diventato quello dello standard, ma gli è stato assegnato un
+valore diverso, mantenendo quello originario, con il comportamento
+corrispondete, per \const{O\_DSYNC} in modo che applicazioni compilate con
+versioni precedenti delle librerie e del kernel non trovassero un
+comportamento diverso. Inoltre il nuovo \const{O\_SYNC} è stato definito in
+maniera opportuna in modo che su versioni del kernel precedenti la 2.6.33
+torni a corrispondere al valore di \const{O\_DSYNC}.
+
+% NOTE: per le differenze fra O_DSYNC, O_SYNC e O_RSYNC introdotte nella
+% nello sviluppo del kernel 2.6.33, vedi http://lwn.net/Articles/350219/
+
+Il flag \constd{O\_PATH},\label{open_o_path_flag} introdotto con il kernel
+2.6.39, viene usato per limitare l'uso del file descriptor restituito da
+\func{open} o all'identificazione di una posizione sul filesystem (ad uso
+delle \textit{at-functions} che tratteremo in sez.~\ref{sec:file_openat}) o
+alle operazioni che riguardano il file descriptor in quanto tale, senza
+consentire operazioni sul file; in sostanza se si apre un file con
+\const{O\_PATH} si potrà soltanto:
+\begin{itemize*}
+\item usare il file descriptor come indicatore della directory di partenza con
+ una delle \textit{at-functions} (vedi sez.~\ref{sec:file_openat});
+\item cambiare directory di lavoro con \func{fchdir} se il file descriptor fa
+ riferimento a una directory (dal kernel 3.5);
+\item usare le funzioni che duplicano il file descriptor (vedi
+ sez.~\ref{sec:file_dup});
+\item passare il file descriptor ad un altro processo usando un socket
+ \const{PF\_UNIX} (vedi sez.~\ref{sec:unix_socket})
+\item ottenere le informazioni relative al file con \func{fstat} (dal kernel
+ 3.6) o al filesystem con \func{fstatfs} (dal kernel 3.12);
+\item ottenere il valore dei \textit{file descriptor flags} (fra cui comparirà
+ anche lo stesso \const{O\_PATH}) o impostare o leggere i \textit{file status
+ flags} con \func{fcntl} (rispettivamente con le operazioni
+ \const{F\_GETFL}, \const{F\_SETFD} e \const{F\_GETFD}, vedi
+ sez.~\ref{sec:file_fcntl_ioctl}).
+\item chiudere il file con \func{close}.
+\end{itemize*}