\label{sec:file_open}
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 \itindex{file~descriptor} file descriptor, il suo prototipo è:
+quella che crea l'associazione fra un \textit{pathname} ed un
+\itindex{file~descriptor} file descriptor, il suo prototipo è:
\begin{functions}
\headdecl{sys/types.h}
\headdecl{sys/stat.h}
\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
-\index{directory~di~lavoro} 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}.
+molte altre funzioni che accettano come argomenti dei
+\itindsub{pathname}{relativo} \textit{pathname} relativi, è che, quando un
+\textit{pathname} relativo non fa riferimento alla \index{directory~di~lavoro}
+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 \index{directory~di~lavoro} directory di lavoro
corrente è una proprietà del singolo processo; questo significa che quando si
\func{open}, \func{mkdir}, ecc.) sono state introdotte delle ulteriori
funzioni, dette anche funzioni ``\textit{at}'' in quanto contraddistinte dal
suffisso \texttt{at}, che permettono 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
+altre operazioni) usando un \itindsub{pathname}{relativo} \textit{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 \textit{pathname} del tipo di
\texttt{/proc/self/fd/dirfd/relative\_path}.} Benché queste funzioni non
siano presenti negli standard tradizionali esse sono state adottate da vari
Unix\footnote{oltre a Linux e Solaris sono presenti in vari BSD.} fino ad
definire la macro \macro{\_ATFILE\_SOURCE}.
L'uso di queste funzioni prevede una apertura iniziale della directory che
-sarà la base della risoluzione dei pathname relativi che verranno usati in
-seguito, dopo di che si dovrà passare il relativo file descriptor alle varie
-funzioni che useranno quella directory come punto di partenza per la
-risoluzione.\footnote{in questo modo, anche quando si lavora con i
- \itindex{thread} \textit{thread}, si può mantenere una
- \index{directory~di~lavoro} directory di lavoro diversa per ciascuno di
- essi.}
+sarà la base della risoluzione dei \itindsub{pathname}{relativo}
+\textit{pathname} relativi che verranno usati in seguito, dopo di che si dovrà
+passare il relativo file descriptor alle varie funzioni che useranno quella
+directory come punto di partenza per la risoluzione.\footnote{in questo modo,
+ anche quando si lavora con i \itindex{thread} \textit{thread}, si può
+ mantenere una \index{directory~di~lavoro} directory di lavoro diversa per
+ ciascuno di essi.}
Questo metodo, oltre a risolvere i problemi di \itindex{race~condition}
\textit{race condition}, consente anche di ottenere aumenti di prestazioni
significativi quando si devono eseguire molte operazioni su sezioni
dell'albero dei file che prevedono delle gerarchie di sottodirectory molto
-profonde; infatti in questo caso basta eseguire la risoluzione del pathname
-della directory di partenza una sola volta (nell'apertura iniziale) e non
-tutte le volte che si deve accedere a ciascun file che essa contiene.
+profonde; infatti in questo caso basta eseguire la risoluzione del
+\textit{pathname} della directory di partenza una sola volta (nell'apertura
+iniziale) e non tutte le volte che si deve accedere a ciascun file che essa
+contiene.
La sintassi generale di queste nuove funzioni è che esse prevedono come primo
argomento il file descriptor della directory da usare come base, mentre gli
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
+ \item[\errcode{ENOTDIR}] \param{pathname} è un \itindsub{pathname}{relativo}
+ \textit{pathname} relativo, ma
\param{dirfd} fa riferimento ad un file.
\end{errlist}}
\end{functions}
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
+argomenti si utilizza un \itindsub{pathname}{relativo} \textit{pathname}
+relativo questo sarà risolto rispetto alla directory indicata
+da \param{dirfd}; qualora invece si usi un \itindsub{pathname}{assoluto}
+\textit{pathname} assoluto \param{dirfd} verrà semplicemente ignorato. Infine
+se per
\param{dirfd} si usa il valore speciale \const{AT\_FDCWD},\footnote{questa,
come le altre costanti \texttt{AT\_*}, è definita in \headfile{fcntl.h},
pertanto se la si vuole usare occorrerà includere comunque questo file,
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.}
+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 \itindsub{pathname}{assoluto} \textit{pathname} assoluto, nel
+ qual caso, come detto, il valore di \param{dirfd} sarà completamente
+ ignorato.}
In tab.~\ref{tab:file_atfunc_corr} si sono riportate le funzioni introdotte
con questa nuova interfaccia, con a fianco la corrispondente funzione
\footnotetext{in questo caso l'argomento \param{flags} è disponibile ed
utilizzabile solo a partire dal kernel 2.6.18.}
+% TODO manca prototipo di fchmodat
+
Per tutte le funzioni che lo prevedono, a parte \func{unlinkat} e
\funcd{faccessat}, l'ulteriore argomento è stato introdotto solo per fornire
un meccanismo con cui modificarne il comportamento nel caso si stia operando
\begin{errlist}
\item[\errcode{EBADF}] \param{dirfd} non è un file descriptor valido.
\item[\errcode{EINVAL}] \param{flags} non ha un valore valido.
- \item[\errcode{ENOTDIR}] \param{pathname} è un pathname relativo, ma
- \param{dirfd} fa riferimento ad un file.
+ \item[\errcode{ENOTDIR}] \param{pathname} è un \itindsub{pathname}{relativo}
+ \textit{pathname} relativo, ma \param{dirfd} fa riferimento ad un file.
\end{errlist}}
\end{functions}
\begin{errlist}
\item[\errcode{EBADF}] \param{dirfd} non è un file descriptor valido.
\item[\errcode{EINVAL}] \param{flags} non ha un valore valido.
- \item[\errcode{ENOTDIR}] \param{pathname} è un pathname relativo, ma
- \param{dirfd} fa riferimento ad un file.
+ \item[\errcode{ENOTDIR}] \param{pathname} è un \itindsub{pathname}{relativo}
+ \textit{pathname} relativo, ma \param{dirfd} fa riferimento ad un file.
\end{errlist}}
\end{functions}
\begin{errlist}
\item[\errcode{EBADF}] \param{dirfd} non è un file descriptor valido.
\item[\errcode{EINVAL}] \param{flags} non ha un valore valido.
- \item[\errcode{ENOTDIR}] \param{pathname} è un pathname relativo, ma
- \param{dirfd} fa riferimento ad un file.
+ \item[\errcode{ENOTDIR}] \param{pathname} è un \itindsub{pathname}{relativo}
+ \textit{pathname} relativo, ma \param{dirfd} fa riferimento ad un file.
\end{errlist}}
\end{functions}