+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} assumerà uno dei
+ valori:
+ \begin{errlist}
+ \item[\errcode{EEXIST}] \var{pathname} esiste e si è specificato
+ \const{O\_CREAT} e \const{O\_EXCL}.
+ \item[\errcode{EISDIR}] \var{pathname} indica una directory e si è tentato
+ l'accesso in scrittura.
+ \item[\errcode{ENOTDIR}] si è specificato \const{O\_DIRECTORY} e
+ \var{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 \var{pathname} è un file di dispositivo ma il dispositivo è
+ assente.
+ \item[\errcode{ENODEV}] \var{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
+ pathname o si è indicato \const{O\_NOFOLLOW} e \var{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 \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
+ \const{O\_RDONLY} & apre il file in sola lettura. \\
+ \const{O\_WRONLY} & apre il file in sola scrittura. \\
+ \const{O\_RDWR} & apre il file in lettura/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 \secref{sec:file_ownership}. Il parametro
+ \var{mode} deve essere specificato. \\
+ \const{O\_EXCL} & usato in congiunzione con \const{O\_CREAT} fa sì che
+ l'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. Questo
+ valore specifica anche una modalità di operazione (vedi sotto), e
+ comporta che \func{open} ritorni immediatamente (l'opzione ha senso
+ solo per le fifo, torneremo questo in \secref{sec:ipc_named_pipe}). \\
+ \const{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_ctrl_term}). \\
+ \const{O\_SHLOCK} & opzione di BSD, acquisisce uno shared lock (vedi
+ \secref{sec:file_locking}) sul file. Non è disponibile in Linux. \\
+ \const{O\_EXLOCK} & opzione di BSD, acquisisce uno lock esclusivo (vedi
+ \secref{sec:file_locking}) sul file. Non è disponibile in Linux. \\
+ \const{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. \\
+ \const{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. \\
+ \const{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
+ \textit{DoS}\index{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 col 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. Può causare corruzione del file con NFS 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 \secref{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 \secref{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 dati
+ sul sull'hardware sottostante.\\
+ \const{O\_FSYNC} & sinonimo di \const{O\_SYNC}. \\
+ \const{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 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 race
+ condition\index{race condition}. Si consiglia come alternativa di usare un
+ file con un nome univoco e la funzione \func{link} per verificarne
+ l'esistenza (vedi \secref{sec:ipc_file_lock}).}
+
+\footnotetext[3]{\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.}
+
+\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 è impostato per restare
+aperto attraverso una \func{exec} (come accennato in \secref{sec:proc_exec}) e
+l'offset è impostato 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.
+
+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 \var{file} (al solito si veda lo schema
+di \figref{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 una \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 la \func{read} o la \func{write}). Anch'essi fanno 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 \tabref{tab:file_open_flags} si 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 di loro
+con un OR aritmetico per costruire il valore (in forma di maschera binaria)
+dell'argomento \param{flags} da passare alla \func{open} per specificarne il
+comportamento. 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,
+\func{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 \var{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.
+