+altro processo (torneremo sul significato della condivisione dei file
+descriptor, che in genere si ottiene dopo una \func{fork}, in
+sez.~\ref{sec:file_sharing}) ed è impostato, come accennato in
+sez.~\ref{sec:proc_exec}, per restare aperto attraverso una
+\func{exec}. Inoltre la posizione sul file, il cosiddetto \textit{offset}, è
+impostata all'inizio del file. Una volta aperto un file si potrà operare su di
+esso direttamente tramite il file descriptor, e quanto avviene al
+\textit{pathname} con cui lo si è aperto sarà del tutto ininfluente.
+
+Il comportamento della funzione e le diverse modalità con cui può essere
+aperto il file vengono controllati dall'argomento \param{flags} il cui valore
+deve essere indicato come maschera binaria in cui ciascun bit ha un
+significato specifico. Alcuni di questi bit vanno anche a costituire i
+cosiddetti \textsl{flag di stato} del file (o \itindex{file~status~flag}
+\textit{file status flags}), che vengono mantenuti nel campo \var{f\_flags}
+della struttura \kstruct{file} che abbiamo riportato anche in
+fig.~\ref{fig:file_proc_file}).
+
+Ciascun flag viene identificato da una apposita costante, ed il valore
+di \param{flags} deve essere specificato come OR aritmetico di queste
+costanti. I vari bit che si possono usare come componenti di \param{flags}
+sono divisi in tre gruppi principali. Il primo gruppo è quello dei cosiddetti
+flag delle \textsl{modalità di accesso} (o \textit{access mode flags}), che
+specificano che tipo di accesso si effettuerà sul file, fra lettura, scrittura
+e lettura/scrittura. Questa modalità deve essere indicata usando una delle
+costanti di tab.~\ref{tab:open_access_mode_flag}.
+
+\begin{table}[htb]
+ \centering
+ \footnotesize
+ \begin{tabular}[c]{|l|l|}
+ \hline
+ \textbf{Flag} & \textbf{Significato} \\
+ \hline
+ \hline
+ \const{O\_RDONLY} & Apre il file in sola lettura.\\
+ \const{O\_WRONLY} & Apre il file in sola scrittura.\\
+ \const{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, ma con un numero composto da
+due bit, e che può essere ottenuto dal valore dei \itindex{file~status~flag}
+\textit{file status flags} con un AND aritmetico con la maschera binaria
+\const{O\_ACCMODE}. Questo significa ad esempio che la combinazione
+\code{\const{O\_RDONLY}|\const{O\_WRONLY}} non è affatto equivalente a
+\const{O\_WRONLY}, 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 in file
+ descriptor che non può essere letto o scritto ma solo usato con una
+ \func{ioctl} (vedi sez.~\ref{sec:file_ioctl}).}
+
+Una modalità di accesso al file deve sempre essere specificata quando si apre
+un file, il valore indicato in \param{flags} viene salvato nei
+\itindex{file~status~flag} \textit{file status flags}, e può essere riletto
+con \func{fcntl}, ma non può essere modificato. Nella \acr{glibc} sono
+definite \const{O\_READ} come sinonimo di \const{O\_RDONLY}, \const{O\_WRITE}
+come sinonimo di \const{O\_WRONLY} ed una \const{O\_EXEC} che non esiste su
+Linux per l'apertura per l'esecuzione.\footnote{si tratta di definizioni
+ completamente fuori standard, che suppongono anche l'uso di bit distinti, ed
+ non è il caso di utilizzarle anche quando coincidenti con quelle di Linux.}
+
+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 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}
+quando viene eseguita. Hanno effetto solo al momento della chiamata della
+funzione e non sono memorizzati \itindex{file~status~flag} \textit{file status
+ flags} né possono essere riletti.
+
+\begin{table}[htb]
+ \centering
+ \footnotesize
+ \begin{tabular}[c]{|l|p{8 cm}|}
+ \hline
+ \textbf{Flag} & \textbf{Significato} \\
+ \hline
+ \hline
+ \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.\\
+ \const{O\_DIRECTORY}& Se \param{pathname} non è una directory la
+ chiamata fallisce (dal kernel 2.1.126). Questo
+ flag è specifico di Linux ed è stato introdotto
+ per evitare dei \itindex{Denial~of~Service~(DoS)}
+ \textit{DoS}\footnotemark\\ quando \func{opendir}
+ viene chiamata su una fifo o su un dispositivo
+ associato ad una unità a nastri. Non viene
+ utilizzato al di fuori dell'implementazione di
+ \func{opendir}.\\
+ \const{O\_EXCL} & Se usato in congiunzione con \const{O\_CREAT} fa
+ richiede che il file indicato da \param{pathname}
+ non esista (altrimenti causa un errore di
+ \errcode{EEXIST}).\\
+ \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.\\
+ \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}).\\
+ \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.\\
+ \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 di \func{open} 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}
+
+\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.}
+
+
+
+
+
+\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}).}
+
+
+\const{O\_SHLOCK} Apre il file con uno shared lock (vedi
+ sez.~\ref{sec:file_locking}). Specifica di BSD, assente in Linux.
+
+\const{O\_EXLOCK} Apre il file con un lock esclusivo (vedi
+ sez.~\ref{sec:file_locking}). Specifica di BSD, assente in Linux.
+
+
+Il terzo gruppo è quello dei flag delle \textsl{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}.