+La funzione \funcd{open} è la funzione fondamentale per accedere ai file, ed è
+quella che crea l'associazione fra un
+\index{\textit{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 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
+ sez.~\ref{sec:file_ownership}. L'argomento
+ \param{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 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} & opzione di BSD, acquisisce uno shared lock (vedi
+ sez.~\ref{sec:file_locking}) sul file. Non è
+ disponibile in Linux. \\
+ \const{O\_EXLOCK} & opzione di BSD, acquisisce uno lock esclusivo (vedi
+ sez.~\ref{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 \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
+ \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
+ 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}. \\
+ \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 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{\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}).}
+
+\footnotetext[3]{\textit{Denial of Service}\index{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.}
+
+\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.}
+
+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.
+