X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=fileunix.tex;fp=fileunix.tex;h=3f4d4bbf63bdf8aa699865354a4514f78bc335e2;hp=796f05284d6fa8575c3812801f83328f5d7ae17f;hb=b3593007c4edd76ecbf7386967c1b25d27eed828;hpb=70885537614fe3332312bc9e9fcd900e04f22451 diff --git a/fileunix.tex b/fileunix.tex index 796f052..3f4d4bb 100644 --- a/fileunix.tex +++ b/fileunix.tex @@ -189,8 +189,8 @@ usando direttamente le system call del kernel. \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} @@ -1127,12 +1127,12 @@ file descriptor libero di valore uguale o maggiore di \param{newfd} (e se \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 @@ -1146,13 +1146,14 @@ Solaris, a fianco delle normali funzioni che operano sui file (come \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 @@ -1161,21 +1162,22 @@ POSIX.1; con le \acr{glibc} per l'accesso a queste funzioni è necessario 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 @@ -1195,16 +1197,19 @@ come: 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, @@ -1216,10 +1221,11 @@ 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.} +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 @@ -1266,6 +1272,8 @@ prevista anche l'aggiunta di un ulteriore argomento finale, \param{flags}. \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 @@ -1292,8 +1300,8 @@ che \func{lchown}; il suo prototipo è: \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} @@ -1322,8 +1330,8 @@ il suo prototipo è: \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} @@ -1356,8 +1364,8 @@ prototipo è: \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}