Correzioni multiple agli indici delle funzioni, inserita macro per
[gapil.git] / fileunix.tex
index 796f05284d6fa8575c3812801f83328f5d7ae17f..3a16dddbd77f226272fdc225c0713450c7944e0a 100644 (file)
@@ -77,19 +77,19 @@ quest'ultima tabella.
 
 La \itindex{file~table} \textit{file table} è una tabella che contiene una
 voce per ciascun file che è stato aperto nel sistema. In Linux è costituita da
-strutture di tipo \struct{file}; in ciascuna di esse sono tenute varie
-informazioni relative al file, fra cui:
+puntatori alle strutture di tipo \kstruct{file} di fig.~\ref{fig:kstruct_file}
+che come illustrano mantengono varie informazioni relative al file, fra cui:
 \begin{itemize*}
 \item lo stato del file (nel campo \var{f\_flags}).
 \item il valore della posizione corrente (l'\textit{offset}) nel file (nel
   campo \var{f\_pos}).
 \item un puntatore \itindex{inode} all'inode\footnote{nel kernel 2.4.x si è in
-    realtà passati ad un puntatore ad una struttura \struct{dentry} che punta
-    a sua volta \itindex{inode} all'inode passando per la nuova struttura del
-    VFS.}  del file.
-%\item un puntatore alla tabella delle funzioni \footnote{la struttura
-%    \var{f\_op} descritta in sez.~\ref{sec:file_vfs_work}} che si possono usare
- sul file.
+    realtà passati ad un puntatore ad una struttura \kstruct{dentry} che punta
+    a sua volta \itindex{inode} all'\textit{inode} passando per la nuova
+    struttura del VFS.} del file.
+\item un puntatore \var{f\_op} alla tabella delle funzioni \footnote{quelle
+    della struttura \kstruct{file\_operation}, descritte in
+    tab.~\ref{tab:file_file_operations}.} che si possono usare sul file.
 \end{itemize*}
 
 In fig.~\ref{fig:file_proc_file} si è riportato uno schema in cui è illustrata
@@ -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}
@@ -230,7 +230,7 @@ un \itindex{file~descriptor} file descriptor, il suo prototipo è:
 
 
 La funzione apre il file usando il primo file descriptor libero, e crea
-l'opportuna voce, cioè la struttura \struct{file}, nella \itindex{file~table}
+l'opportuna voce, cioè la struttura \kstruct{file}, nella \itindex{file~table}
 \textit{file table} del processo.  Viene sempre restituito come valore di
 ritorno il file descriptor con il valore più basso disponibile.
 
@@ -412,7 +412,7 @@ sez.~\ref{sec:file_perm_management}) 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
+campo \var{f\_flags} della struttura \kstruct{file} (al solito si veda lo schema
 di fig.~\ref{fig:file_proc_file}).  Essi sono divisi in tre categorie
 principali:
 \begin{itemize*}
@@ -507,7 +507,7 @@ di ripetere tre volte il comando prima di eseguire lo shutdown).
 
 Come già accennato in sez.~\ref{sec:file_fd} a ciascun file aperto è associata
 una \textsl{posizione corrente nel file} (il cosiddetto \textit{file offset},
-mantenuto nel campo \var{f\_pos} di \struct{file}) espressa da un numero intero
+mantenuto nel campo \var{f\_pos} di \kstruct{file}) espressa da un numero intero
 positivo come numero di byte dall'inizio del file. Tutte le operazioni di
 lettura e scrittura avvengono a partire da questa posizione che viene
 automaticamente spostata in avanti del numero di byte letti o scritti.
@@ -725,10 +725,10 @@ posizione \param{offset}, nel buffer \param{buf}.
 \end{prototype}
 
 La funzione prende esattamente gli stessi argomenti di \func{read} con lo
-stesso significato, a cui si aggiunge l'argomento \func{offset} che indica una
-posizione sul file. Identico è il comportamento ed il valore di ritorno. La
-funzione serve quando si vogliono leggere dati dal file senza modificare la
-posizione corrente.
+stesso significato, a cui si aggiunge l'argomento \param{offset} che indica
+una posizione sul file. Identico è il comportamento ed il valore di
+ritorno. La funzione serve quando si vogliono leggere dati dal file senza
+modificare la posizione corrente.
 
 L'uso di \func{pread} è equivalente all'esecuzione di una \func{read} seguita
 da una \func{lseek} che riporti al valore precedente la posizione corrente sul
@@ -841,7 +841,7 @@ Il primo caso è quello in cui due processi diversi aprono lo stesso file su
 disco; sulla base di quanto visto in sez.~\ref{sec:file_fd} avremo una
 situazione come quella illustrata in fig.~\ref{fig:file_mult_acc}: ciascun
 processo avrà una sua voce nella \textit{file table} referenziata da un
-diverso file descriptor nella sua \struct{file\_struct}. Entrambe le voci
+diverso file descriptor nella sua \kstruct{file\_struct}. Entrambe le voci
 nella \itindex{file~table} \textit{file table} faranno però riferimento allo
 stesso \itindex{inode} inode su disco.
 
@@ -862,7 +862,7 @@ che:
   prima impostata alla dimensione corrente del file letta \itindex{inode}
   dall'inode. Dopo la scrittura il file viene automaticamente esteso.
 \item l'effetto di \func{lseek} è solo quello di cambiare il campo
-  \var{f\_pos} nella struttura \struct{file} della \itindex{file~table}
+  \var{f\_pos} nella struttura \kstruct{file} della \itindex{file~table}
   \textit{file table}, non c'è nessuna operazione sul file su disco. Quando la
   si usa per porsi alla fine del file la posizione viene impostata leggendo la
   dimensione corrente \itindex{inode} dall'inode.
@@ -882,7 +882,7 @@ figlio all'esecuzione di una \func{fork} (si ricordi quanto detto in
 sez.~\ref{sec:proc_fork}). La situazione è illustrata in
 fig.~\ref{fig:file_acc_child}; dato che il processo figlio riceve una copia
 dello spazio di indirizzi del padre, riceverà anche una copia di
-\struct{file\_struct} e relativa tabella dei file aperti.
+\kstruct{file\_struct} e relativa tabella dei file aperti.
 
 In questo modo padre e figlio avranno gli stessi file descriptor che faranno
 riferimento alla stessa voce nella \textit{file table}, condividendo così la
@@ -894,10 +894,10 @@ corrente nel file varierà per entrambi i processi (in quanto verrà modificato
 Si noti inoltre che anche i flag di stato del file (quelli impostati
 dall'argomento \param{flag} di \func{open}) essendo tenuti nella voce della
 \textit{file table}\footnote{per la precisione nel campo \var{f\_flags} di
-  \struct{file}.}, vengono in questo caso condivisi. Ai file però sono
+  \kstruct{file}.}, vengono in questo caso condivisi. Ai file però sono
 associati anche altri flag, dei quali l'unico usato al momento è
 \const{FD\_CLOEXEC}, detti \textit{file descriptor flags}. Questi ultimi sono
-tenuti invece in \struct{file\_struct}, e perciò sono specifici di ciascun
+tenuti invece in \kstruct{file\_struct}, e perciò sono specifici di ciascun
 processo e non vengono modificati dalle azioni degli altri anche in caso di
 condivisione della stessa voce della \textit{file table}.
 
@@ -1055,7 +1055,7 @@ file descriptor è una copia esatta del precedente ed entrambi possono essere
 interscambiati nell'uso. Per capire meglio il funzionamento della funzione si
 può fare riferimento a fig.~\ref{fig:file_dup}: l'effetto della funzione è
 semplicemente quello di copiare il valore nella struttura
-\struct{file\_struct}, cosicché anche il nuovo file descriptor fa riferimento
+\kstruct{file\_struct}, cosicché anche il nuovo file descriptor fa riferimento
 alla stessa voce nella \textit{file table}; per questo si dice che il nuovo
 file descriptor è \textsl{duplicato}, da cui il nome della funzione.
 
@@ -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
@@ -1248,14 +1254,14 @@ prevista anche l'aggiunta di un ulteriore argomento finale, \param{flags}.
      \func{fstatat}   &$\bullet$&\func{stat},\func{lstat}  \\
      \func{utimensat} &$\bullet$&\func{utimes},\func{lutimes}\\
      \func{linkat}    &$\bullet$\footnotemark&\func{link}    \\
-     \func{mkdirat}   & --      &\func{mkdir}   \\
-     \func{mknodat}   & --      &\func{mknod}   \\
+     \funcm{mkdirat}  & --      &\func{mkdir}   \\
+     \funcm{mknodat}  & --      &\func{mknod}   \\
      \func{openat}    & --      &\func{open}    \\
-     \func{readlinkat}& --      &\func{readlink}\\
-     \func{renameat}  & --      &\func{rename}  \\
-     \func{symlinkat} & --      &\func{symlink} \\
+     \funcm{readlinkat}& --     &\func{readlink}\\
+     \funcm{renameat} & --      &\func{rename}  \\
+     \funcm{symlinkat}& --      &\func{symlink} \\
      \func{unlinkat}  &$\bullet$&\func{unlink},\func{rmdir}  \\
-     \func{mkfifoat}  & --      &\func{mkfifo}  \\
+     \funcm{mkfifoat} & --      &\func{mkfifo}  \\
     \hline
   \end{tabular}
   \caption{Corrispondenze fra le nuove funzioni ``\textit{at}'' e le
@@ -1266,6 +1272,11 @@ 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, verificare se metterlo o metter menzione
+% TODO manca prototipo di fstatat, verificare se metterlo o metter menzione
+% TODO manca prototipo di linkat, verificare se metterlo o metter menzione
+% TODO manca prototipo di utimensat, verificare se metterlo o metter menzione
+
 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
@@ -1285,15 +1296,15 @@ che \func{lchown}; il suo prototipo è:
   \funcdecl{int fchownat(int dirfd, const char *pathname, uid\_t owner, gid\_t
     group, int flags)}
 
-  .Modifica la proprietà di un file.
+  Modifica la proprietà di un file.
   
   \bodydesc{la funzione restituisce gli stessi valori e gli stessi codici di
     errore di \func{chown}, ed in più:
   \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 +1333,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 +1367,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}
 
@@ -1370,6 +1381,12 @@ in cui questo è una directory, se però si imposta \param{flags} al valore di
 caso \param{pathname} deve essere una directory, che sarà rimossa qualora
 risulti vuota.
 
+% TODO manca prototipo e motivazione di fexecve, da trattare qui in quanto
+% inserita nello stesso standard e da usare con openat, vedi 
+% http://pubs.opengroup.org/onlinepubs/9699939699/toc.pdf
+
+
+
 
 \subsection{La funzione \func{fcntl}}
 \label{sec:file_fcntl}