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
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.
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*}
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.
\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
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.
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.
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
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}.
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.
\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
\footnotetext{in questo caso l'argomento \param{flags} è disponibile ed
utilizzabile solo a partire dal kernel 2.6.18.}
-% TODO manca prototipo di fchmodat
+% 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
\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ù:
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}