+Si noti che per quanto illustrato in fig.~\ref{fig:file_dup} i file descriptor
+duplicati condivideranno eventuali lock, \textit{file status flag}, e
+posizione corrente. Se ad esempio si esegue una \func{lseek} per modificare la
+posizione su uno dei due file descriptor, essa risulterà modificata anche
+sull'altro (dato che quello che viene modificato è lo stesso campo nella voce
+della \textit{file table} a cui entrambi fanno riferimento). L'unica
+differenza fra due file descriptor duplicati è che ciascuno avrà il suo
+\textit{file descriptor flag}; a questo proposito va specificato che nel caso
+di \func{dup} il flag di \textit{close-on-exec}\itindex{close-on-exec} (vedi
+sez.~\ref{sec:proc_exec} e sez.~\ref{sec:file_fcntl}) viene sempre cancellato
+nella copia.
+
+L'uso principale di questa funzione è per la redirezione dell'input e
+dell'output fra l'esecuzione di una \func{fork} e la successiva \func{exec};
+diventa così possibile associare un file (o una pipe) allo standard input o
+allo standard output (torneremo sull'argomento in sez.~\ref{sec:ipc_pipe_use},
+quando tratteremo le pipe). Per fare questo in genere occorre prima chiudere
+il file che si vuole sostituire, cosicché il suo file descriptor possa esser
+restituito alla chiamata di \func{dup}, come primo file descriptor
+disponibile.
+
+Dato che questa è l'operazione più comune, è prevista una diversa versione
+della funzione, \funcd{dup2}, che permette di specificare esplicitamente
+qual è il valore di file descriptor che si vuole avere come duplicato; il suo
+prototipo è:
+\begin{prototype}{unistd.h}{int dup2(int oldfd, int newfd)}
+
+ Rende \param{newfd} una copia del file descriptor \param{oldfd}.
+
+ \bodydesc{La funzione ritorna il nuovo file descriptor in caso di successo e
+ $-1$ in caso di errore, nel qual caso \var{errno} assumerà uno dei valori:
+ \begin{errlist}
+ \item[\errcode{EBADF}] \param{oldfd} non è un file aperto o \param{newfd} ha
+ un valore fuori dall'intervallo consentito per i file descriptor.
+ \item[\errcode{EMFILE}] si è raggiunto il numero massimo consentito di file
+ descriptor aperti.
+ \end{errlist}}
+\end{prototype}
+\noindent e qualora il file descriptor \param{newfd} sia già aperto (come
+avviene ad esempio nel caso della duplicazione di uno dei file standard) esso
+sarà prima chiuso e poi duplicato (così che il file duplicato sarà connesso
+allo stesso valore per il file descriptor).
+
+La duplicazione dei file descriptor può essere effettuata anche usando la
+funzione di controllo dei file \func{fcntl} (che esamineremo in
+sez.~\ref{sec:file_fcntl}) con il parametro \const{F\_DUPFD}. L'operazione ha
+la sintassi \code{fcntl(oldfd, F\_DUPFD, newfd)} e se si usa 0 come valore per
+\param{newfd} diventa equivalente a \func{dup}.
+
+La sola differenza fra le due funzioni\footnote{a parte la sintassi ed i
+ diversi codici di errore.} è che \func{dup2} chiude il file descriptor
+\param{newfd} se questo è già aperto, garantendo che la duplicazione sia
+effettuata esattamente su di esso, invece \func{fcntl} restituisce il primo
+file descriptor libero di valore uguale o maggiore di \param{newfd} (e se
+\param{newfd} è aperto la duplicazione avverrà su un altro file descriptor).
+
+
+
+\subsection{Le funzioni \func{openat}, \func{mkdirat} e affini}
+\label{sec:file_openat}
+
+Un problema che si pone con l'uso della funzione \func{open}, così come per
+molte altre funzioni che accettano come argomenti dei pathname relativi, è
+che, quando un pathname relativo non fa riferimento alla directory di lavoro
+corrente, è possibile che alcuni dei suoi componenti vengano modificati in
+parallelo alla chiamata a \func{open}, e questo lascia aperta la possibilità
+di una \itindex{race~condition} \textit{race condition}.
+
+Inoltre come già accennato, la directory di lavoro corrente è una proprietà
+del singolo processo; questo significa che quando si lavora con i thread essa
+sarà la stessa per tutti, ma esistono molti casi in cui sarebbe invece utile
+che ogni singolo thread avesse la sua directory di lavoro.
+
+Per risolvere questi problemi, riprendendo una interfaccia già presente in
+Solaris, a fianco delle normali funzioni che operano sui file (come
+\func{open}, \func{mkdir}, ecc.) sono state introdotte delle ulteriori
+funzioni, contraddistinte dal suffisso \texttt{at}, che permettono che
+permettano l'apertura di un file (o le rispettive altre operazioni) usando un
+pathname relativo ad una directory specificata.\footnote{l'introduzione è
+ avvenuta su proposta dello sviluppatore principale delle \acr{glibc} Urlich
+ Drepper; le corrispondenti system call sono state inserite nel kernel
+ ufficiale a partire dalla versione 2.6.16, in precedenza era disponibile una
+ emulazione che, sia pure con prestazioni inferiori, funzionava facendo
+ ricorso all'uso del filesystem \textit{proc} con l'apertura del file
+ attraverso il riferimento a pathname del tipo di
+ \texttt{/proc/self/fd/dirfd/relative\_path}.} Benché queste non siano
+funzioni standard esse sono disponibili anche su altri Unix\footnote{oltre al
+ citato Solaris ne è prevista l'inclusione anche in BSD.} e sono state
+proposte per l'inclusione nello standard POSIX.1, nelle future revisioni dello
+stesso.
+
+L'idea è che si apra prima la directory che si vuole usare come base dei
+pathname relativo, e si passi il file descriptor alla funzione che userà
+quella directory come punto di partenza per la risoluzione.\footnote{in questo
+ modo, anche quando si lavora con i thread, si può mantenere anche una
+ directory di lavoro diversa per ciascuno di essi.} Con queste funzioni si
+possono anche ottenere grossi aumenti di prestazioni quando si devono eseguire
+operazioni su delle sezioni di albero dei file che prevedono gerarchie molto
+profonde e grandi quantità di file e directory, dato che basta eseguire la
+risoluzione di un pathname una sola volta (nell'apertura della directory) e
+non per ciascun file che essa contiene.
+
+La sintassi generale di queste nuove funzioni è che esse prendano come primo
+argomento il file descriptor della directory da usare come base, mentre gli
+argomenti successivi restano identici a quelli della corrispondente funzione
+ordinaria; ad esempio nel caso di \funcd{openat} avremo che essa è definita
+come:
+\begin{functions}
+ \headdecl{fcntl.h}
+ \funcdecl{int openat(int dirfd, const char *pathname, int flags)}
+ \funcdecl{int openat(int dirfd, const char *pathname, int flags, mode\_t
+ mode))}
+
+ Apre un file usando come directory di lavoro corrente \param{dirfd}.
+
+ \bodydesc{la funzione restituisce gli stessi valori e gli stessi codici di
+ errore di \func{open}, ed in più:
+ \begin{errlist}
+ \item[\errcode{EBADF}] \param{dirfd} non è un file descriptor valido.
+ \item[\errcode{ENOTDIR}] \param{pathname} è un pathname relativo, ma
+ \param{dirfd} fa riferimento ad un file.
+ \end{errlist}}
+\end{functions}
+
+In tab.~\ref{tab:file_atfunc_corr} si sono riportate le funzioni introdotte
+con questa nuova interfaccia, con a fianco la corrispondente funzione
+classica. Tranne che nel caso di \func{faccessat} e \func{unlinkat} tutti i
+loro prototipi seguono la convenzione appena vista per \func{openat}, in cui
+agli argomenti della corrispondente funzione classica viene anteposto
+l'argomento \param{dirfd}.\footnote{non staremo pertanto a riportarli uno per
+ uno.}
+
+\begin{table}[htb]
+ \centering
+ \footnotesize
+ \begin{tabular}[c]{|l|l|}
+ \hline
+ \textbf{Funzione} & \textbf{Corrispondente} \\
+ \hline
+ \hline
+ \func{faccessat} &\func{access} \\
+ \func{fchmodat} &\func{chmod} \\
+ \func{fchownat} &\func{chown} \\
+ \func{fstatat} &\func{stat} \\
+ \func{futimesat} &\func{utimes} \\
+ \func{linkat} &\func{link} \\
+ \func{mkdirat} &\func{mkdir} \\
+ \func{mknodat} &\func{mknod} \\
+ \func{openat} &\func{open} \\
+ \func{readlinkat}&\func{readlink}\\
+ \func{renameat} &\func{rename} \\
+ \func{symlinkat} &\func{symlink} \\
+ \func{unlinkat} &\func{unlink} \\
+ \func{mkfifoat} &\func{mkfifo} \\
+ \hline
+ \end{tabular}
+ \caption{Corrispondenze fra le nuove funzioni ``\textit{at}'' e le
+ corrispettive funzioni classiche.}
+ \label{tab:file_atfunc_corr}
+\end{table}
+
+% TODO documentare utimesat, introdotta in 2.6.22
+% http://kernelnewbies.org/Linux_2_6_22
+
+Il comportamento delle nuove funzioni è del tutto analogo a quello delle
+corrispettive classiche, con la sola eccezione del fatto che se fra i loro
+argomenti si utilizza un pathname relativo questo sarà risolto rispetto alla
+directory indicata da \param{dirfd}; qualora invece si usi un pathname
+assoluto \param{dirfd} verrà semplicemente ignorato. Infine se per
+\param{dirfd} si usa il valore speciale \const{AT\_FDCWD}, la risoluzione sarà
+effettuata rispetto alla directory di lavoro corrente del processo.
+
+Così come il comportamento, anche i valori di ritorno e le condizioni di
+errore delle nuove funzioni sono gli stessi delle funzioni classiche, agli
+errori si aggiungono però quelli dovuti a valori errati per \param{dirfd}; in
+particolare si avrà un errore di \errcode{EBADF} se esso non è un file
+descriptor valido, ed un errore di \errcode{ENOTDIR} se esso non fa riferimento
+ad una directory.\footnote{tranne il caso in cui si sia specificato un
+ pathname assoluto, nel qual caso, come detto, il valore di \param{dirfd}
+ sarà completamente ignorato.}
+
+Come accennato ci sono due eccezioni alla precedente regola, \func{faccessat}
+e \func{unlinkat}, che tratteremo esplicitamente. Dette funzioni, oltre a
+prendere \param{dirfd} come primo argomento aggiuntivo, prendono un ulteriore
+argomento finale \param{flags}, utilizzato come maschera binaria. Nel caso di
+\funcd{faccessat} avremo cioè:
+\begin{functions}
+ \headdecl{unistd.h}
+ \funcdecl{int faccessat(int dirfd, const char *path, int mode, int flags)}
+
+ Controlla i permessi di accesso.
+
+ \bodydesc{la funzione restituisce gli stessi valori e gli stessi codici di
+ errore di \func{access}, ed in più:
+ \begin{errlist}
+ \item[\errcode{EBADF}] \param{dirfd} non è un file descriptor valido.
+ \item[\errcode{ENOTDIR}] \param{pathname} è un pathname relativo, ma
+ \param{dirfd} fa riferimento ad un file.
+ \end{errlist}}
+\end{functions}
+
+La funzione esegue lo stesso controllo di accesso effettuabile con
+\func{access}, ma si può utilizzare l'argomento \param{flags} per modificarne
+il comportamento rispetto a quello ordinario di \func{access}; questo infatti
+può essere specificato come maschera binaria dei seguenti valori:
+\begin{basedescript}{\desclabelwidth{2.0cm}}
+\item[\const{AT\_EACCESS}] se impostato esegue il controllo dei permessi
+ usando l'\textsl{user-ID effettivo} invece di quello reale (il comportamento
+ di default, che riprende quello di \func{access}).
+\item[\const{AT\_SYMLINK\_NOFOLLOW}] se impostato non esegue la
+ dereferenziazione del link simbolico (il comportamento di default, che
+ riprende quello di \func{access}), ma effettua il controllo sui permessi del
+ link simbolico stesso.
+\end{basedescript}
+
+Nel caso di \func{unlinkat} l'ulteriore argomento \param{flags} viene inserito
+perché detta funzione può comportarsi sia come analogo di \func{unlink} che di
+\func{rmdir}; pertanto il suo prototipo è:
+\begin{functions}
+ \headdecl{fcntl.h}
+ \funcdecl{int unlinkat(int dirfd, const char *pathname, int flags)}
+
+ Rimuove una voce da una directory.
+
+ \bodydesc{la funzione restituisce gli stessi valori e gli stessi codici di
+ errore di \func{unlink} o di \func{rmdir} a seconda del valore di
+ \param{flags}, ed in più:
+ \begin{errlist}
+ \item[\errcode{EBADF}] \param{dirfd} non è un file descriptor valido.
+ \item[\errcode{ENOTDIR}] \param{pathname} è un pathname relativo, ma
+ \param{dirfd} fa riferimento ad un file.
+ \end{errlist}}
+\end{functions}
+
+Di default il comportamento di \func{unlinkat} è equivalente a quello che
+avrebbe \func{unlink} applicata a \param{pathname}, fallendo se questo è una
+directory, se però si imposta \param{flags} al valore di
+\const{AT\_REMOVEDIR},\footnote{anche se \param{flags} è una maschera binaria,
+ essendo questo l'unico flag disponibile, lo si può assegnare direttamente.}
+essa si comporterà come \func{rmdir}.
+