X-Git-Url: https://gapil.gnulinux.it/gitweb/?a=blobdiff_plain;f=fileunix.tex;h=dad3b0fc0e7d67ff56ced3db6006924a9d774d58;hb=85590332c245e487cff2b566b2df286acc4289ee;hp=5de72aa67cd481a748a0c4c9d9ca829fd9a45687;hpb=193d612d40c5f81f5559ea6e11e70f6b6e51fb39;p=gapil.git diff --git a/fileunix.tex b/fileunix.tex index 5de72aa..dad3b0f 100644 --- a/fileunix.tex +++ b/fileunix.tex @@ -40,7 +40,7 @@ tutte le implementazione di un sistema unix-like. Per poter accedere al contenuto di un file occorre creare un canale di comunicazione con il kernel che renda possibile operare su di esso (si ricordi quanto visto in sez.~\ref{sec:file_vfs_work}). Questo si fa aprendo il file -con la funzione \func{open} che provvederà a localizzare \index{inode} l'inode +con la funzione \func{open} che provvederà a localizzare \itindex{inode} l'inode del file e inizializzare i puntatori che rendono disponibili le funzioni che il VFS mette a disposizione (riportate in tab.~\ref{tab:file_file_operations}). Una volta terminate le operazioni, il @@ -83,9 +83,9 @@ informazioni relative al file, fra cui: \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 \index{inode} all'inode\footnote{nel kernel 2.4.x si è in +\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 \index{inode} all'inode passando per la nuova struttura del + 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 @@ -101,7 +101,7 @@ capire i dettagli del funzionamento dell'interfaccia dei \textit{file \index{file!descriptor|)} -\begin{figure}[htb] +\begin{figure}[!htb] \centering \includegraphics[width=13cm]{img/procfile} \caption{Schema della architettura dell'accesso ai file attraverso @@ -142,7 +142,7 @@ tab.~\ref{tab:file_std_files}. \footnotesize \begin{tabular}[c]{|l|l|} \hline - \textbf{Costante} & \textbf{Significato} \\ + \textbf{File} & \textbf{Significato} \\ \hline \hline \const{STDIN\_FILENO} & \textit{file descriptor} dello \textit{standard @@ -162,7 +162,7 @@ In fig.~\ref{fig:file_proc_file} si è rappresentata una situazione diversa, facendo riferimento ad un programma in cui lo \textit{standard input} è associato ad un file mentre lo \textit{standard output} e lo \textit{standard error} sono entrambi associati ad un altro file (e quindi utilizzano lo -stesso \index{inode} inode). +stesso \itindex{inode} inode). Nelle vecchie versioni di Unix (ed anche in Linux fino al kernel 2.0.x) il numero di file aperti era anche soggetto ad un limite massimo dato dalle @@ -322,7 +322,7 @@ ritorno il file descriptor con il valore più basso disponibile. \const{O\_NONBLOCK}.\\ \const{O\_ASYNC} & Apre il file per l'I/O in modalità asincrona (vedi sez.~\ref{sec:file_asyncronous_io}). Quando è - impostato viene generato il segnale \const{SIGIO} + impostato viene generato il segnale \signal{SIGIO} tutte le volte che sono disponibili dati in input sul file.\\ \const{O\_SYNC} & Apre il file per l'input/output sincrono: ogni @@ -552,6 +552,10 @@ seguenti valori\footnote{per compatibilità con alcune vecchie notazioni per ottenere la nuova posizione corrente. \end{basedescript} +% TODO, trattare, SEEK_HOLE e SEEK_DATA, inclusi nel kernel 3.1, vedi +% http://lwn.net/Articles/439623/ + + Si tenga presente che la chiamata a \func{lseek} non causa nessun accesso al file, si limita a modificare la posizione corrente (cioè il valore \var{f\_pos} in \param{file}, vedi fig.~\ref{fig:file_proc_file}). Dato che @@ -765,7 +769,7 @@ scrivere su di esso utilizzando la funzione \funcd{write}, il cui prototipo è: processo o su una posizione oltre il massimo consentito. \item[\errcode{EPIPE}] \param{fd} è connesso ad una pipe il cui altro capo è chiuso in lettura; in questo caso viene anche generato il segnale - \const{SIGPIPE}, se questo viene gestito (o bloccato o ignorato) la + \signal{SIGPIPE}, se questo viene gestito (o bloccato o ignorato) la funzione ritorna questo errore. \item[\errcode{EINTR}] si è stati interrotti da un segnale prima di aver potuto scrivere qualsiasi dato. @@ -826,7 +830,7 @@ fig.~\ref{fig:file_proc_file} le principali strutture usate dal kernel; esamineremo ora in dettaglio le conseguenze che questa architettura ha nei confronti dell'accesso allo stesso file da parte di processi diversi. -\begin{figure}[htb] +\begin{figure}[!htb] \centering \includegraphics[width=15cm]{img/filemultacc} \caption{Schema dell'accesso allo stesso file da parte di due processi @@ -840,7 +844,7 @@ 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 nella \itindex{file~table} \textit{file table} faranno però riferimento allo -stesso \index{inode} inode su disco. +stesso \itindex{inode} inode su disco. Questo significa che ciascun processo avrà la sua posizione corrente sul file, la sua modalità di accesso e versioni proprie di tutte le proprietà che @@ -852,20 +856,20 @@ che: \item ciascun processo può scrivere indipendentemente; dopo ciascuna \func{write} la posizione corrente sarà cambiata solo nel processo. Se la scrittura eccede la dimensione corrente del file questo verrà esteso - automaticamente con l'aggiornamento del campo \var{i\_size} \index{inode} + automaticamente con l'aggiornamento del campo \var{i\_size} \itindex{inode} nell'inode. \item se un file è in modalità \itindex{append~mode} \const{O\_APPEND} tutte le volte che viene effettuata una scrittura la posizione corrente viene - prima impostata alla dimensione corrente del file letta \index{inode} + 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} \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 \index{inode} dall'inode. + dimensione corrente \itindex{inode} dall'inode. \end{itemize} -\begin{figure}[htb] +\begin{figure}[!htb] \centering \includegraphics[width=15cm]{img/fileshar} \caption{Schema dell'accesso ai file da parte di un processo figlio} @@ -1015,7 +1019,7 @@ Entrambe le funzioni forzano la sincronizzazione col disco di tutti i dati del file specificato, ed attendono fino alla conclusione delle operazioni; \func{fsync} forza anche la sincronizzazione dei meta-dati del file (che riguardano sia le modifiche alle tabelle di allocazione dei settori, che gli -altri dati contenuti \index{inode} nell'inode che si leggono con \func{fstat}, +altri dati contenuti \itindex{inode} nell'inode che si leggono con \func{fstat}, come i tempi del file). Si tenga presente che questo non comporta la sincronizzazione della @@ -1056,7 +1060,7 @@ semplicemente quello di copiare il valore nella struttura alla stessa voce nella \textit{file table}; per questo si dice che il nuovo file descriptor è \textsl{duplicato}, da cui il nome della funzione. -\begin{figure}[htb] +\begin{figure}[!htb] \centering \includegraphics[width=14cm]{img/filedup} \caption{Schema dell'accesso ai file duplicati} \label{fig:file_dup} @@ -1139,15 +1143,15 @@ molti casi in cui sarebbe invece utile che ogni singolo \itindex{thread} 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 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 +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 \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 @@ -1325,7 +1329,7 @@ il comportamento rispetto a quello ordinario di \func{access}. In questo caso esso può essere specificato come maschera binaria di due valori: \begin{basedescript}{\desclabelwidth{3.0cm}} \item[\const{AT\_EACCESS}] se impostato \funcd{faccessat} esegue il controllo - dei permessi usando l'\textsl{user-ID effettivo} invece di quello reale (il + dei permessi usando l'\acr{uid} effettivo invece di quello reale (il comportamento di default, che riprende quello di \func{access}). \item[\const{AT\_SYMLINK\_NOFOLLOW}] se impostato \funcd{faccessat} non esegue la dereferenziazione dei link simbolici, effettuando il controllo dei @@ -1455,13 +1459,13 @@ per \var{cmd} è riportata di seguito: (vedi sez.~\ref{sec:sess_proc_group}) raggruppamenti di processi usati nel controllo di sessione; a ciascuno di essi è associato un identificatore (un numero positivo analogo al \acr{pid}).} che è preposto alla ricezione - dei segnali \const{SIGIO}\footnote{o qualunque altro segnale alternativo + dei segnali \signal{SIGIO}\footnote{o qualunque altro segnale alternativo impostato con \const{F\_FSETSIG}.} per gli eventi associati al file descriptor \param{fd}\footnote{il segnale viene usato sia per il \textit{Signal Drive I/O}, che tratteremo in sez.~\ref{sec:file_asyncronous_operation}, e dai vari meccanismi di notifica asincrona, che tratteremo in - sez.~\ref{sec:file_asyncronous_lease}.} e \const{SIGURG} per la notifica + sez.~\ref{sec:file_asyncronous_lease}.} e \signal{SIGURG} per la notifica dei dati urgenti di un socket.\footnote{vedi sez.~\ref{sec:TCP_urgent_data}.} Nel caso di un \textit{process group} viene restituito un valore negativo il cui valore assoluto corrisponde @@ -1469,7 +1473,7 @@ per \var{cmd} è riportata di seguito: caso di errore viene restituito $-1$. \item[\const{F\_SETOWN}] imposta, con il valore dell'argomento \param{arg}, l'identificatore del processo o del \itindex{process~group} \textit{process - group} che riceverà i segnali \const{SIGIO} e \const{SIGURG} per gli + group} che riceverà i segnali \signal{SIGIO} e \signal{SIGURG} per gli eventi associati al file descriptor \param{fd}, ritorna un valore nullo in caso di successo o $-1$ in caso di errore. Come per \const{F\_GETOWN}, per impostare un \itindex{process~group} \textit{process group} si deve usare @@ -1478,14 +1482,14 @@ per \var{cmd} è riportata di seguito: \item[\const{F\_GETSIG}] restituisce il valore del segnale inviato quando ci sono dati disponibili in ingresso su un file descriptor aperto ed impostato per l'I/O asincrono (si veda sez.~\ref{sec:file_asyncronous_io}). Il valore 0 - indica il valore predefinito (che è \const{SIGIO}), un valore diverso da + indica il valore predefinito (che è \signal{SIGIO}), un valore diverso da zero indica il segnale richiesto, (che può essere anche lo stesso - \const{SIGIO}). In caso di errore ritorna $-1$. + \signal{SIGIO}). In caso di errore ritorna $-1$. \item[\const{F\_SETSIG}] imposta il segnale da inviare quando diventa possibile effettuare I/O sul file descriptor in caso di I/O asincrono, ritorna un valore nullo in caso di successo o $-1$ in caso di errore. Il - valore zero indica di usare il segnale predefinito, \const{SIGIO}. Un altro - valore diverso da zero (compreso lo stesso \const{SIGIO}) specifica il + valore zero indica di usare il segnale predefinito, \signal{SIGIO}. Un altro + valore diverso da zero (compreso lo stesso \signal{SIGIO}) specifica il segnale voluto; l'uso di un valore diverso da zero permette inoltre, se si è installato il gestore del segnale come \var{sa\_sigaction} usando \const{SA\_SIGINFO}, (vedi sez.~\ref{sec:sig_sigaction}), di rendere @@ -1510,7 +1514,7 @@ per \var{cmd} è riportata di seguito: argomento può essere omesso. Questa funzionalità avanzata è trattata in dettaglio in sez.~\ref{sec:file_asyncronous_lease}. \item[\const{F\_NOTIFY}] attiva un meccanismo di notifica per cui viene - riportata al processo chiamante, tramite il segnale \const{SIGIO} (o altro + riportata al processo chiamante, tramite il segnale \signal{SIGIO} (o altro segnale specificato con \const{F\_SETSIG}) ogni modifica eseguita o direttamente sulla directory cui \var{fd} fa riferimento, o su uno dei file in essa contenuti; ritorna un valore nullo in caso di successo o $-1$ in caso @@ -1659,11 +1663,11 @@ operazioni che sono predefinite per qualunque file,\footnote{in particolare tipo \texttt{const int *}) che contiene un valore logico (un valore nullo disabilita, un valore non nullo abilita). \item[\const{FIOSETOWN}] imposta il processo che riceverà i segnali - \const{SIGURG} e \const{SIGIO} generati sul file; il terzo argomento deve + \signal{SIGURG} e \signal{SIGIO} generati sul file; il terzo argomento deve essere un puntatore ad un intero (cioè di tipo \texttt{const int *}) il cui valore specifica il PID del processo. \item[\const{FIOGETOWN}] legge il processo che riceverà i segnali - \const{SIGURG} e \const{SIGIO} generati sul file; il terzo argomento deve + \signal{SIGURG} e \signal{SIGIO} generati sul file; il terzo argomento deve essere un puntatore ad un intero (cioè di tipo \texttt{int *}) su cui sarà scritto il PID del processo. \item[\const{FIONREAD}] legge il numero di byte disponibili in lettura sul @@ -1681,7 +1685,6 @@ operazioni che sono predefinite per qualunque file,\footnote{in particolare % TODO aggiungere FIBMAP e FIEMAP, vedi http://lwn.net/Articles/260832 - Si noti però come la gran parte di queste operazioni specifiche dei file (per essere precisi le prime sei dell'elenco) siano effettuabili in maniera generica anche tramite l'uso di \func{fcntl}. Le due funzioni infatti sono