X-Git-Url: https://gapil.gnulinux.it/gitweb/?a=blobdiff_plain;f=fileunix.tex;h=95dc1840d035d316f975f0e945a938203ed9b5c5;hb=15b31cba44b7cfc22edbefcba5597039893ed8dd;hp=8af781cc276be9409f4e9ba2ddcce4ea23026378;hpb=83e1332031e23f0760030f317652976d487f613c;p=gapil.git diff --git a/fileunix.tex b/fileunix.tex index 8af781c..95dc184 100644 --- a/fileunix.tex +++ b/fileunix.tex @@ -1,6 +1,6 @@ %% fileunix.tex %% -%% Copyright (C) 2000-2005 Simone Piccardi. Permission is granted to +%% Copyright (C) 2000-2006 Simone Piccardi. Permission is granted to %% copy, distribute and/or modify this document under the terms of the GNU Free %% Documentation License, Version 1.1 or any later version published by the %% Free Software Foundation; with the Invariant Sections being "Un preambolo", @@ -55,7 +55,8 @@ valore come argomento alle varie funzioni dell'interfaccia. Per capire come funziona il meccanismo occorre spiegare a grandi linee come il kernel gestisce l'interazione fra processi e file. Il kernel mantiene sempre un elenco dei processi attivi nella cosiddetta \itindex{process~table} -\textit{process table} ed un elenco dei file aperti nella \textit{file table}. +\textit{process table} ed un elenco dei file aperti nella +\itindex{file~table} \textit{file table}. La \itindex{process~table} \textit{process table} è una tabella che contiene una voce per ciascun processo attivo nel sistema. In Linux ciascuna voce è @@ -68,20 +69,20 @@ che il processo ha aperto, ed in particolare: \item i flag relativi ai file descriptor. \item il numero di file aperti. \item una tabella che contiene un puntatore alla relativa voce nella - \textit{file table} per ogni file aperto. + \itindex{file~table} \textit{file table} per ogni file aperto. \end{itemize*} il \textit{file descriptor} in sostanza è l'intero positivo che indicizza quest'ultima tabella. -La \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: +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: \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 all'inode\index{inode}\footnote{nel kernel 2.4.x si è in +\item un puntatore \index{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 all'inode\index{inode} passando per la nuova struttura del VFS.} del file. @@ -118,10 +119,10 @@ stato chiuso nessuno in precedenza). In tutti i sistemi unix-like esiste una convenzione generale per cui ogni processo viene lanciato dalla shell con almeno tre file aperti. Questi, per -quanto appena detto, avranno come \textit{file - descriptor}\index{file!descriptor} i valori 0, 1 e 2. Benché questa sia -soltanto una convenzione, essa è seguita dalla gran parte delle applicazioni, -e non aderirvi potrebbe portare a gravi problemi di interoperabilità. +quanto appena detto, avranno come \index{file!descriptor} \textit{file + descriptor} i valori 0, 1 e 2. Benché questa sia soltanto una convenzione, +essa è seguita dalla gran parte delle applicazioni, e non aderirvi potrebbe +portare a gravi problemi di interoperabilità. Il primo file è sempre associato al cosiddetto \textit{standard input}; è cioè il file da cui il processo si aspetta di ricevere i dati in ingresso. Il @@ -228,9 +229,9 @@ un 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 \textit{file table} -del processo. Viene sempre restituito come valore di ritorno il file -descriptor con il valore più basso disponibile. +l'opportuna voce, cioè la struttura \struct{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. \footnotetext[2]{la pagina di manuale di \func{open} segnala che questa opzione è difettosa su NFS, e che i programmi che la usano per stabilire un @@ -261,8 +262,9 @@ descriptor con il valore pi \hline \const{O\_CREAT} & Se il file non esiste verrà creato, con le regole di titolarità del file viste in - sez.~\ref{sec:file_ownership}. Con questa opzione - l'argomento \param{mode} deve essere specificato. \\ + sez.~\ref{sec:file_ownership_management}. Con questa + opzione l'argomento \param{mode} deve essere + specificato. \\ \const{O\_EXCL} & Usato in congiunzione con \const{O\_CREAT} fa sì che la precedente esistenza del file diventi un errore\protect\footnotemark\ che fa fallire @@ -296,7 +298,8 @@ descriptor con il valore pi \itindex{Denial~of~Service~(DoS)} \textit{DoS}\protect\footnotemark\ quando \func{opendir} viene chiamata su una fifo o su un - device di unità a nastri, non deve essere utilizzato + dispositivo associato ad una unità a nastri, non deve + dispositivo a nastri; non deve essere utilizzato al di fuori dell'implementazione di \func{opendir}. \\ \const{O\_LARGEFILE}&nel caso di sistemi a 32 bit che supportano file di grandi dimensioni consente di aprire file le cui @@ -304,7 +307,8 @@ descriptor con il valore pi a 31 bit. \\ \hline \hline % modalità di operazione coi file - \const{O\_APPEND} & Il file viene aperto in append mode. Prima di ciascuna + \const{O\_APPEND} & Il file viene aperto in \itindex{append~mode} + \textit{append mode}. Prima di ciascuna scrittura la posizione corrente viene sempre impostata alla fine del file. Con NFS si può avere una corruzione del file se più di un processo scrive allo @@ -355,9 +359,10 @@ descriptor con il valore pi \label{tab:file_open_flags} \end{table} -\footnotetext[4]{il problema è che NFS non supporta la scrittura in append, ed - il kernel deve simularla, ma questo comporta la possibilità di una race - condition, vedi sez.~\ref{sec:file_atomic}.} +\footnotetext[4]{il problema è che NFS non supporta la scrittura in + \itindex{append~mode} \textit{append}, ed il kernel deve simularla, ma + questo comporta la possibilità di una \itindex{race~condition} \textit{race + condition}, vedi sez.~\ref{sec:file_atomic}.} \footnotetext[5]{l'opzione origina da SVr4, dove però causava il ritorno da una \func{read} con un valore nullo e non con un errore, questo introduce @@ -389,7 +394,7 @@ L'argomento \param{mode} indica i permessi con cui il file viene creato; i valori possibili sono gli stessi già visti in sez.~\ref{sec:file_perm_overview} e possono essere specificati come OR binario delle costanti descritte in tab.~\ref{tab:file_bit_perm}. Questi permessi sono filtrati dal valore di -\var{umask} (vedi sez.~\ref{sec:file_umask}) per il processo. +\var{umask} (vedi 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 @@ -455,12 +460,13 @@ descriptor ritorna disponibile; il suo prototipo ed inoltre \errval{EIO}.} \end{prototype} -La chiusura di un file rilascia ogni blocco (il \textit{file - locking}\index{file!locking} è trattato in sez.~\ref{sec:file_locking}) che -il processo poteva avere acquisito su di esso; se \param{fd} è l'ultimo +La chiusura di un file rilascia ogni blocco (il \textit{file locking} +\index{file!locking} è trattato in sez.~\ref{sec:file_locking}) che il +processo poteva avere acquisito su di esso; se \param{fd} è l'ultimo riferimento (di eventuali copie) ad un file aperto, tutte le risorse nella -file table vengono rilasciate. Infine se il file descriptor era l'ultimo -riferimento ad un file su disco quest'ultimo viene cancellato. +\itindex{file~table} \textit{file table} vengono rilasciate. Infine se il file +descriptor era l'ultimo riferimento ad un file su disco quest'ultimo viene +cancellato. Si ricordi che quando un processo termina anche tutti i suoi file descriptor vengono chiusi, molti programmi sfruttano questa caratteristica e non usano @@ -493,9 +499,10 @@ 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. -In genere (a meno di non avere richiesto la modalità \const{O\_APPEND}) questa -posizione viene impostata a zero all'apertura del file. È possibile impostarla -ad un valore qualsiasi con la funzione \funcd{lseek}, il cui prototipo è: +In genere (a meno di non avere richiesto la modalità \itindex{append~mode} +\const{O\_APPEND}) questa posizione viene impostata a zero all'apertura del +file. È possibile impostarla ad un valore qualsiasi con la funzione +\funcd{lseek}, il cui prototipo è: \begin{functions} \headdecl{sys/types.h} \headdecl{unistd.h} @@ -506,8 +513,7 @@ ad un valore qualsiasi con la funzione \funcd{lseek}, il cui prototipo successo e $-1$ in caso di errore nel qual caso \var{errno} assumerà uno dei valori: \begin{errlist} - \item[\errcode{ESPIPE}] \param{fd} è una pipe, un socket\index{socket} o una - fifo. + \item[\errcode{ESPIPE}] \param{fd} è una pipe, un socket o una fifo. \item[\errcode{EINVAL}] \param{whence} non è un valore valido. \end{errlist} ed inoltre \errval{EBADF}.} @@ -610,11 +616,11 @@ sez.~\ref{sec:file_noblocking}) e ritorna solo quando ne arrivano; se il numero di byte richiesti eccede quelli disponibili la funzione ritorna comunque, ma con un numero di byte inferiore a quelli richiesti. -Lo stesso comportamento avviene caso di lettura dalla rete (cioè su un -socket\index{socket}, come vedremo in sez.~\ref{sec:sock_io_behav}), o per la -lettura da certi file di dispositivo, come le unità a nastro, che -restituiscono sempre i dati ad un singolo blocco alla volta, o come le linee -seriali, che restituiscono solo i dati ricevuti fino al momento della lettura. +Lo stesso comportamento avviene caso di lettura dalla rete (cioè su un socket, +come vedremo in sez.~\ref{sec:sock_io_behav}), o per la lettura da certi file +di dispositivo, come le unità a nastro, che restituiscono sempre i dati ad un +singolo blocco alla volta, o come le linee seriali, che restituiscono solo i +dati ricevuti fino al momento della lettura. Infine anche le due condizioni segnalate dagli errori \errcode{EINTR} ed \errcode{EAGAIN} non sono propriamente degli errori. La prima si verifica @@ -651,7 +657,7 @@ posizione \param{offset}, nel buffer \param{buf}. 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. Indetico è il comportamento ed il valore di ritorno. La +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. @@ -708,11 +714,11 @@ scrivere su di esso utilizzando la funzione \funcd{write}, il cui prototipo Come nel caso di \func{read} la funzione tenta di scrivere \param{count} byte a partire dalla posizione corrente nel file e sposta automaticamente la posizione in avanti del numero di byte scritti. Se il file è aperto in -modalità \const{O\_APPEND} i dati vengono sempre scritti alla fine del file. -Lo standard POSIX richiede che i dati scritti siano immediatamente disponibili -ad una \func{read} chiamata dopo che la \func{write} che li ha scritti è -ritornata; ma dati i meccanismi di caching non è detto che tutti i filesystem -supportino questa capacità. +modalità \itindex{append~mode} \const{O\_APPEND} i dati vengono sempre scritti +alla fine del file. Lo standard POSIX richiede che i dati scritti siano +immediatamente disponibili ad una \func{read} chiamata dopo che la +\func{write} che li ha scritti è ritornata; ma dati i meccanismi di caching +non è detto che tutti i filesystem supportino questa capacità. Se \param{count} è zero la funzione restituisce zero senza fare nient'altro. Per i file ordinari il numero di byte scritti è sempre uguale a quello @@ -781,10 +787,11 @@ stesso file, in particolare occorre tenere presente che: scrittura eccede la dimensione corrente del file questo verrà esteso automaticamente con l'aggiornamento del campo \var{i\_size} nell'inode\index{inode}. -\item se un file è in modalità \const{O\_APPEND} tutte le volte che viene - effettuata una scrittura la posizione corrente viene prima impostata alla - dimensione corrente del file letta dall'inode\index{inode}. Dopo la - scrittura il file viene automaticamente esteso. +\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 + dall'inode\index{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 \textit{file table}, non c'è nessuna operazione sul file su disco. Quando la si usa per porsi alla @@ -838,8 +845,8 @@ Se dal punto di vista della lettura dei dati questo non comporta nessun problema, quando si andrà a scrivere le operazioni potranno mescolarsi in maniera imprevedibile. Il sistema però fornisce in alcuni casi la possibilità di eseguire alcune operazioni di scrittura in maniera coordinata anche senza -utilizzare meccanismi di sincronizzazione più complessi (come il \textit{file - locking}\index{file!locking}, che esamineremo in +utilizzare meccanismi di sincronizzazione più complessi (come il +\index{file!locking} \textit{file locking}, che esamineremo in sez.~\ref{sec:file_locking}). Un caso tipico di necessità di accesso condiviso in scrittura è quello in cui @@ -855,11 +862,12 @@ ma il nostro primo processo avr Il problema è che usare due system call in successione non è un'operazione atomica; il problema è stato risolto introducendo la modalità -\const{O\_APPEND}. In questo caso infatti, come abbiamo descritto in -precedenza, è il kernel che aggiorna automaticamente la posizione alla fine -del file prima di effettuare la scrittura, e poi estende il file. Tutto questo -avviene all'interno di una singola system call (la \func{write}) che non -essendo interrompibile da un altro processo costituisce un'operazione atomica. +\itindex{append~mode} \const{O\_APPEND}. In questo caso infatti, come abbiamo +descritto in precedenza, è il kernel che aggiorna automaticamente la posizione +alla fine del file prima di effettuare la scrittura, e poi estende il file. +Tutto questo avviene all'interno di una singola system call (la \func{write}) +che non essendo interrompibile da un altro processo costituisce un'operazione +atomica. Un altro caso tipico in cui è necessaria l'atomicità è quello in cui si vuole creare un \textsl{file di lock}\index{file!di lock}, bloccandosi se il file @@ -1051,8 +1059,8 @@ descriptor, che non riguardano la normale lettura e scrittura di dati, ma la gestione sia delle loro proprietà, che di tutta una serie di ulteriori funzionalità che il kernel può mettere a disposizione.\footnote{ad esempio si gestiscono con questa funzione varie modalità di I/O asincrono (vedi - sez.~\ref{sec:file_asyncronous_operation}) e il file - locking\index{file!locking} (vedi sez.~\ref{sec:file_locking}).} + sez.~\ref{sec:file_asyncronous_operation}) e il \textit{file locking} + \index{file!locking} (vedi sez.~\ref{sec:file_locking}).} Per queste operazioni di manipolazione e di controllo delle varie proprietà e caratteristiche di un file descriptor, viene usata la funzione \funcd{fcntl}, @@ -1217,7 +1225,7 @@ accesso dal \textit{file status flag}. \subsection{La funzione \func{ioctl}} \label{sec:file_ioctl} -Benché il concetto di \textit{everything is a file} si sia dimostratato molto +Benché il concetto di \textit{everything is a file} si sia dimostrato molto valido anche per l'interazione con i dispositivi più vari, fornendo una interfaccia che permette di interagire con essi tramite le stesse funzioni usate per i normali file di dati, esisteranno sempre caratteristiche @@ -1241,9 +1249,9 @@ file descriptor. Il prototipo di questa funzione caso di errore viene sempre restituito $-1$ ed \var{errno} assumerà uno dei valori: \begin{errlist} - \item[\errcode{ENOTTY}] il file \param{fd} non è associato con un device, o - la richiesta non è applicabile all'oggetto a cui fa riferimento - \param{fd}. + \item[\errcode{ENOTTY}] il file \param{fd} non è associato con un + dispositivo, o la richiesta non è applicabile all'oggetto a cui fa + riferimento \param{fd}. \item[\errcode{EINVAL}] gli argomenti \param{request} o \param{argp} non sono validi. \end{errlist} @@ -1309,3 +1317,25 @@ relativi ad operazioni comunque eseguibili anche attraverso \func{fcntl}. %%% mode: latex %%% TeX-master: "gapil" %%% End: + +% LocalWords: descriptor system call cap like kernel sez l'inode inode VFS tab +% LocalWords: process table struct files flags pos all'inode dentry fig shell +% LocalWords: error POSIX STDIN FILENO STDOUT STDERR unistd read write lseek +% LocalWords: close pathname sys fcntl int const char errno EEXIST CREAT EXCL +% LocalWords: EISDIR ENOTDIR ENXIO NOBLOCK WRONLY fifo ENODEV ETXTBSY ELOOP of +% LocalWords: NOFOLLOW EACCES ENAMETOOLONG ENOENT EROFS EFAULT ENOSPC ENOMEM +% LocalWords: EMFILE ENFILE NFS lock race condition Denial Service DoS RDONLY +% LocalWords: glibc RDWR NONBLOCK NOCTTY SHLOCK shared BSD EXLOCK TRUNC device +% LocalWords: opendir LARGEFILE APPEND append NDELAY ASYNC l'I SIGIO SYNC SVr +% LocalWords: DSYNC RSYNC filesystem DIRECT caching SGI IRIX dell'I FreeBSD fd +% LocalWords: fork exec umask SOURCE creat filedes EBADF EINTR EIO locking off +% LocalWords: behind sync flush shutdown whence ESPIPE socket EINVAL INCR XTND +% LocalWords: SEEK CUR EPIPE ssize void buf size count EAGAIN EWOULDBLOCK log +% LocalWords: Specification pwrite pread EFBIG SIGPIPE nell'inode dall'inode +% LocalWords: CLOEXEC stat fsync cache update l'update bdflush Documentation +% LocalWords: fdatasync fstat ext dup oldfd newfd DUPFD cmd long arg flock pid +% LocalWords: SETFD GETFD GETFL SETFL GETLK SETLK SETLKW GETOWN group SIGURG +% LocalWords: SETOWN GETSIG SETSIG sigaction SIGINFO siginfo SETLEASE lease is +% LocalWords: truncate GETLEASE NOTIFY all'I AND ACCMODE ioctl everything argp +% LocalWords: framebuffer request ENOTTY CDROM nell'header magic number +% LocalWords: FIOCLEX FIONCLEX FIOASYNC FIONBIO NOATIME