+La funzione \func{open} è la funzione fondamentale per accedere ai file, ed è
+quella che crea l'associazione fra un 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 \var{pathname} nella modalità indicata da
+ \var{flags}, e, nel caso il file sia creato, con gli eventuali permessi
+ specificati da \var{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} viene settata ad
+ uno dei valori:
+ \begin{errlist}
+ \item[\macro{EEXIST}] \var{pathname} esiste e si è specificato
+ \macro{O\_CREAT} e \macro{O\_EXCL}.
+ \item[\macro{EISDIR}] \var{pathname} indica una directory e si è tentato
+ l'accesso in scrittura.
+ \item[\macro{ENOTDIR}] si è specificato \macro{O\_DIRECTORY} e \var{pathname}
+ non è una directory.
+ \item[\macro{ENXIO}] si sono settati \macro{O\_NOBLOCK} o \macro{O\_WRONLY}
+ ed il file è una fifo che non viene letta da nessun processo o
+ \var{pathname} è un file di dispositivo ma il dispositivo è assente.
+ \item[\macro{ENODEV}] \var{pathname} si riferisce a un file di dispositivo
+ che non esiste.
+ \item[\macro{ETXTBSY}] si è cercato di accedere in scrittura all'immagine di
+ un programma in esecuzione.
+ \item[\macro{ELOOP}] si sono incontrati troppi link simbolici nel risolvere
+ pathname o si è indicato \macro{O\_NOFOLLOW} e \var{pathname} è un link
+ simbolico.
+ \end{errlist}
+ ed inoltre \macro{EACCES}, \macro{ENAMETOOLONG}, \macro{ENOENT},
+ \macro{EROFS}, \macro{EFAULT}, \macro{ENOSPC}, \macro{ENOMEM},
+ \macro{EMFILE} e \macro{ENFILE}.}
+\end{functions}
+
+La funzione apre il file, usando il primo file descriptor libero, e crea
+l'opportuna voce (cioè la struttura \var{file}) nella file table. Viene usato
+sempre il file descriptor con il valore più basso.
+
+\begin{table}[!htb]
+ \centering
+ \footnotesize
+ \begin{tabular}[c]{|l|p{12cm}|}
+ \hline
+ \textbf{Flag} & \textbf{Descrizione} \\
+ \hline
+ \hline % modalità di accesso al file
+ \macro{O\_RDONLY} & apre il file in sola lettura. \\
+ \macro{O\_WRONLY} & apre il file in sola scrittura. \\
+ \macro{O\_RDWR} & apre il file lettura/scrittura. \\
+ \hline % modalità di apertura del file
+ \hline
+ \macro{O\_CREAT} & se il file non esiste verrà creato, con le regole di
+ titolarità del file viste in \secref{sec:file_ownership}. Il parametro
+ \var{mode} deve essere specificato. \\
+ \macro{O\_EXCL} & usato in congiunzione con \macro{O\_CREAT} fa sì che
+ l'esistenza del file diventi un errore\protect\footnotemark\ che fa fallire
+ \func{open} con \macro{EEXIST}. \\
+ \macro{O\_NONBLOCK} & apre il file in modalità non bloccante. Questo
+ valore specifica anche una modalità di operazione (vedi sotto), e
+ comporta che \func{open} ritorni immediatamente (torneremo su
+ questo in \secref{sec:file_noblocking}). \\
+ \macro{O\_NOCTTY} & se \var{pathname} si riferisce ad un device di
+ terminale, questo non diventerà il terminale di controllo, anche se il
+ processo non ne ha ancora uno (si veda \secref{sec:sess_xxx}). \\
+ \macro{O\_SHLOCK} & opzione di BSD, acquisisce uno shared lock (vedi
+ \secref{sec:file_locking}) sul file. Non è disponibile in Linux. \\
+ \macro{O\_EXLOCK} & opzione di BSD, acquisisce uno lock esclusivo (vedi
+ \secref{sec:file_locking}) sul file. Non è disponibile in Linux. \\
+ \macro{O\_TRUNC} & se il file esiste ed è un file di dati e la modalità di
+ apertura consente la scrittura, allora la sua lunghezza verrà troncata a
+ zero. Se il file è un terminale o una fifo il flag verrà ignorato, negli
+ altri casi il comportamento non è specificato. \\
+ \macro{O\_NOFOLLOW} & se \var{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. \\
+ \macro{O\_DIRECTORY} & se \var{pathname} non è una directory la chiamata
+ fallisce. Questo flag è specifico di Linux ed è stato introdotto con il
+ kernel 2.1.126 per evitare dei 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}. \\
+ \macro{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 col file
+ \macro{O\_APPEND} & il file viene aperto in append mode. Prima di ciascuna
+ scrittura la posizione corrente viene sempre settata alla fine del
+ file. Può causare corruzione del file con NFS se più di un processo scrive
+ allo stesso tempo.\footnotemark\\
+ \macro{O\_NONBLOCK} & il file viene aperto in modalità non bloccante per
+ le operazioni di I/O: questo significa il fallimento di una \func{read} in
+ assenza di dati da leggere e quello di una \func{write} in caso di
+ impossibilità di scrivere immediatamente. L'opzione è effettiva solo per
+ le fifo e per alcuni file di dispositivo. \\
+ \macro{O\_NDELAY} & in Linux\footnotemark\ è sinonimo di
+ \macro{O\_NONBLOCK}.\\
+ \macro{O\_ASYNC} & apre il file per l'input/output in modalità
+ asincrona. Quando è settato viene generato un segnale di \macro{SIGIO}
+ tutte le volte che è disponibile dell'input sul file. \\
+ \macro{O\_SYNC} & apre il file per l'input/output sincrono, ogni
+ \func{write} bloccherà fino al completamento della scrittura di tutti dati
+ sul sull'hardware sottostante.\\
+ \macro{O\_FSYNC} & sinonimo di \macro{O\_SYNC}. \\
+ \macro{O\_NOATIME} & blocca l'aggiornamento dei tempi dei di accesso dei
+ file (vedi \secref{sec:file_file_times}). In Linux questa opzione non è
+ disponibile per il singolo file ma come opzione per il filesystem in fase
+ di montaggio.\\
+ \hline
+ \end{tabular}
+ \caption{Valori e significato dei vari bit del \textit{file status flag}.}
+ \label{tab:file_open_flags}
+\end{table}
+
+\footnotetext[2]{la man page di \func{open} segnala che questa opzione è
+ difettosa su NFS, e che i programmi che la usano per stabilire un file di
+ lock possono incorrere in una race condition. Si consiglia come alternativa
+ di usare un file con un nome univoco e la funzione \func{link} per
+ verificarne l'esistenza.}
+
+\footnotetext[3]{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.}
+
+\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 \secref{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 \secref{sec:file_read} il ritorno di
+ zero da parte di \func{read} ha il significato di una end-of-file.}
+
+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 \secref{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
+\secref{sec:file_sharing}). Il nuovo file descriptor è settato di default per
+restare aperto attraverso una \func{exec} (come accennato in
+\secref{sec:proc_exec}) ed l'offset è settato all'inizio del file.
+
+L'argomento \param{mode} specifica i permessi con cui il file viene
+eventualmente creato; i valori possibili sono gli stessi già visti in
+\secref{sec:file_perm_overview} e possono essere specificati come OR binario
+delle costanti descritte in \tabref{tab:file_bit_perm}. Questi permessi sono
+filtrati dal valore di \var{umask} (vedi \secref{sec:file_umask}) per il
+processo.