+La funzione \funcd{open} è la funzione fondamentale per accedere ai file, ed è
+quella che crea l'associazione fra un \itindex{pathname}\textit{pathname} ed
+un file descriptor, il suo prototipo è:
+\begin{functions}
+ \headdecl{sys/types.h}
+ \headdecl{sys/stat.h}
+ \headdecl{fcntl.h}
+ \funcdecl{int open(const char *pathname, int flags)}
+ \funcdecl{int open(const char *pathname, int flags, mode\_t mode)}
+ Apre il file indicato da \param{pathname} nella modalità indicata da
+ \param{flags}, e, nel caso il file sia creato, con gli eventuali permessi
+ specificati da \param{mode}.
+
+ \bodydesc{La funzione ritorna il file descriptor in caso di successo e $-1$
+ in caso di errore. In questo caso la variabile \var{errno} assumerà uno
+ dei valori:
+ \begin{errlist}
+ \item[\errcode{EEXIST}] \param{pathname} esiste e si è specificato
+ \const{O\_CREAT} e \const{O\_EXCL}.
+ \item[\errcode{EISDIR}] \param{pathname} indica una directory e si è tentato
+ l'accesso in scrittura.
+ \item[\errcode{ENOTDIR}] si è specificato \const{O\_DIRECTORY} e
+ \param{pathname} non è una directory.
+ \item[\errcode{ENXIO}] si sono impostati \const{O\_NOBLOCK} o
+ \const{O\_WRONLY} ed il file è una fifo che non viene letta da nessun
+ processo o \param{pathname} è un file di dispositivo ma il dispositivo è
+ assente.
+ \item[\errcode{ENODEV}] \param{pathname} si riferisce a un file di
+ dispositivo che non esiste.
+ \item[\errcode{ETXTBSY}] si è cercato di accedere in scrittura all'immagine
+ di un programma in esecuzione.
+ \item[\errcode{ELOOP}] si sono incontrati troppi link simbolici nel
+ risolvere il \textit{pathname} o si è indicato \const{O\_NOFOLLOW} e
+ \param{pathname} è un link simbolico.
+ \end{errlist}
+ ed inoltre \errval{EACCES}, \errval{ENAMETOOLONG}, \errval{ENOENT},
+ \errval{EROFS}, \errval{EFAULT}, \errval{ENOSPC}, \errval{ENOMEM},
+ \errval{EMFILE} e \errval{ENFILE}.}
+\end{functions}
+
+
+La funzione apre il file usando il primo file descriptor libero, e crea
+l'opportuna voce, cioè la struttura \struct{file}, nella \textit{file table}
+del processo. Viene sempre restituito come valore di ritorno il file
+descriptor con il valore più basso disponibile.
+
+\footnotetext[2]{la pagina di manuale di \func{open} segnala che questa
+ opzione è difettosa su NFS, e che i programmi che la usano per stabilire un
+ \textsl{file di lock}\index{file!di lock} possono incorrere in una
+ \textit{race condition}\itindex{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}).}
+
+\footnotetext[3]{acronimo di \textit{Denial of
+ Service}\itindex{Denial~of~Service~(DoS)}, 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.}
+
+\begin{table}[!htb]
+ \centering
+ \footnotesize
+ \begin{tabular}[c]{|l|p{12cm}|}
+ \hline
+ \textbf{Flag} & \textbf{Descrizione} \\
+ \hline
+ \hline % modalità di accesso al file
+ \const{O\_RDONLY} & Apre il file in sola lettura, le \acr{glibc}
+ definiscono anche \const{O\_READ} come sinonimo. \\
+ \const{O\_WRONLY} & Apre il file in sola scrittura, le \acr{glibc}
+ definiscono anche \const{O\_WRITE} come sinonimo. \\
+ \const{O\_RDWR} & Apre il file sia in lettura che in scrittura. \\
+ \hline % modalità di apertura del file
+ \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}. Con questa opzione
+ l'argomento \param{mode} deve essere specificato. \\
+ \const{O\_EXCL} & Usato in congiunzione con \const{O\_CREAT} fa sì che
+ la precedente esistenza del file diventi un
+ errore\protect\footnotemark\ che fa fallire
+ \func{open} con \errcode{EEXIST}. \\
+ \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}). \\
+ \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\_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.\\
+ \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. \\
+ \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. \\
+ \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}\protect\footnotemark\ 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}. \\
+ \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. \\
+ \hline
+ \hline % modalità di operazione coi file
+ \const{O\_APPEND} & Il file viene aperto in 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.\footnotemark\\
+ \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. \\
+ \const{O\_NDELAY} & In Linux\footnotemark\ è sinonimo di
+ \const{O\_NONBLOCK}.\\
+ \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 \const{SIGIO}
+ tutte le volte che sono disponibili dati in input
+ sul file. \\
+ \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.\\
+ \const{O\_FSYNC} & sinonimo di \const{O\_SYNC}, usato da BSD. \\
+ \const{O\_DSYNC} & Variante di I/O sincrono definita da POSIX; presente
+ dal kernel 2.1.130 come sinonimo di
+ \const{O\_SYNC}. \\
+ \const{O\_RSYNC} & Variante analoga alla precedente, trattata allo stesso
+ modo. \\
+ \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.\\
+ \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\footnotemark ottimizzano il proprio
+ caching. 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.\\
+ \hline
+ \end{tabular}
+ \caption{Valori e significato dei vari bit del \textit{file status flag}.}
+ \label{tab:file_open_flags}
+\end{table}
+
+\footnotetext[4]{il problema è che NFS non supporta la scrittura in append, ed
+ il kernel deve simularla, ma questo comporta la possibilità di una race
+ condition, vedi sez.~\ref{sec:file_atomic}.}
+
+\footnotetext[5]{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 end-of-file.}
+
+\footnotetext[6]{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.}
+
+
+Questa caratteristica permette di prevedere qual è il valore del file
+descriptor che si otterrà al ritorno di \func{open}, e viene talvolta usata da
+alcune applicazioni per sostituire i file corrispondenti ai file standard
+visti in sez.~\ref{sec:file_std_descr}: se ad esempio si chiude lo standard
+input e si apre subito dopo un nuovo file questo diventerà il nuovo standard
+input (avrà cioè il file descriptor 0).
+
+Il nuovo file descriptor non è condiviso con nessun altro processo (torneremo
+sulla condivisione dei file, in genere accessibile dopo una \func{fork}, in
+sez.~\ref{sec:file_sharing}) ed è impostato per restare aperto attraverso una
+\func{exec} (come accennato in sez.~\ref{sec:proc_exec}); l'offset è impostato
+all'inizio del file.
+
+L'argomento \param{mode} indica i permessi con cui il file viene creato; 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
+\var{umask} (vedi sez.~\ref{sec:file_umask}) 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 flag di stato del file (o \textit{file status flag}), che è mantenuto nel
+campo \var{f\_flags} della struttura \struct{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.
+\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.
+\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}.
+\end{itemize*}
+
+In tab.~\ref{tab:file_open_flags} sono riportate, ordinate e divise fra loro
+secondo le tre modalità appena elencate, le costanti mnemoniche associate a
+ciascuno di questi bit. Dette costanti possono essere combinate fra loro con
+un OR aritmetico per costruire il valore (in forma di maschera binaria)
+dell'argomento \param{flags} da passare alla \func{open}. I due flag
+\const{O\_NOFOLLOW} e \const{O\_DIRECTORY} sono estensioni specifiche di
+Linux, e deve essere definita la macro \macro{\_GNU\_SOURCE} per poterli
+usare.
+
+Nelle prime versioni di Unix i valori di \param{flag} specificabili per
+\func{open} erano solo quelli relativi alle modalità di accesso del file. Per
+questo motivo per creare un nuovo file c'era una system call apposita,
+\funcd{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 \param{mode}. È del
+ tutto equivalente a \code{open(filedes, O\_CREAT|O\_WRONLY|O\_TRUNC, mode)}.
+\end{prototype}
+\noindent adesso questa funzione resta solo per compatibilità con i vecchi
+programmi.
+