X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=fileio.tex;h=a963c9622103bdf58b2ae3d4246dcbe0951b0056;hp=eb448e3efb0678c1924ee0f1a1b4d88a68f384e6;hb=3f50b8e3fd683f710e34a88436109157d328e1b6;hpb=0c4a9ed958f4797e1cf4dc90e0c0358e302956f5 diff --git a/fileio.tex b/fileio.tex index eb448e3..a963c96 100644 --- a/fileio.tex +++ b/fileio.tex @@ -762,7 +762,8 @@ file. È possibile impostarla ad un valore qualsiasi con la funzione di sistema \item[\errcode{EINVAL}] \param{whence} non è un valore valido. \item[\errcode{EOVERFLOW}] \param{offset} non può essere rappresentato nel tipo \type{off\_t}. - \item[\errcode{ESPIPE}] \param{fd} è una pipe, un socket o una fifo. + \item[\errcode{ESPIPE}] \param{fd} è una \textit{pipe}, un socket o una + \textit{fifo}. \end{errlist} ed inoltre \errval{EBADF} nel suo significato generico.} \end{funcproto} @@ -838,17 +839,18 @@ POSIX però non specifica niente in proposito. Inoltre alcuni un errore ma restituiscono un valore indefinito. \itindbeg{sparse~file} +\index{file!\textit{hole}|(} Infine si tenga presente che, come accennato in sez.~\ref{sec:file_file_size}, con \func{lseek} è possibile impostare una posizione anche oltre la corrente fine del file. In tal caso alla successiva scrittura il file sarà esteso a partire da detta posizione, con la creazione di quello che viene chiamato -\index{file!\textit{hole}} ``\textsl{buco}'' (in gergo \textit{hole}) nel -file. Il nome deriva dal fatto che nonostante la dimensione del file sia -cresciuta in seguito alla scrittura effettuata, lo spazio vuoto fra la -precedente fine del file ed la nuova parte scritta dopo lo spostamento non -corrisponde ad una allocazione effettiva di spazio su disco, che sarebbe -inutile dato che quella zona è effettivamente vuota. +``\textsl{buco}'' (in gergo \textit{hole}) nel file. Il nome deriva dal fatto +che nonostante la dimensione del file sia cresciuta in seguito alla scrittura +effettuata, lo spazio vuoto fra la precedente fine del file ed la nuova parte +scritta dopo lo spostamento non corrisponde ad una allocazione effettiva di +spazio su disco, che sarebbe inutile dato che quella zona è effettivamente +vuota. Questa è una delle caratteristiche specifiche della gestione dei file di un sistema unix-like e si dice che il file in questione è uno \textit{sparse @@ -893,19 +895,18 @@ inutilizzato. A partire dal kernel 3.1, riprendendo una interfaccia adottata su Solaris, sono state aggiunti due nuovi valori per l'argomento \param{whence}, riportati nella seconda sezione di tab.~\ref{tab:lseek_whence_values}, che consentono di -riconoscere la presenza di \index{file!\textit{hole}} \textit{hole} -all'interno dei file ad uso di quelle applicazioni (come i programmi di -backup) che possono salvare spazio disco nella copia degli \textit{sparse - file}. Una applicazione può così determinare la presenza di un -\index{file!\textit{hole}} \textit{hole} usando \const{SEEK\_HOLE} all'inizio -del file e determinare poi l'inizio della successiva sezione di dati usando +riconoscere la presenza di \textit{hole} all'interno dei file ad uso di quelle +applicazioni (come i programmi di backup) che possono salvare spazio disco +nella copia degli \textit{sparse file}. Una applicazione può così determinare +la presenza di un \textit{hole} usando \const{SEEK\_HOLE} all'inizio del file +e determinare poi l'inizio della successiva sezione di dati usando \const{SEEK\_DATA}. Per compatibilità con i filesystem che non supportano questa funzionalità è previsto comunque che in tal caso \const{SEEK\_HOLE} riporti sempre la fine del file e \const{SEEK\_DATA} il valore di \param{offset}. Inoltre la decisione di come riportare (o di non riportare) la presenza di un -\index{file!\textit{hole}} buco in un file è lasciata all'implementazione del +buco in un file è lasciata all'implementazione del filesystem, dato che esistono vari motivi per cui una sezione di un file può non contenere dati ed essere riportata come tale (ad esempio può essere stata preallocata con \func{fallocate}, vedi sez.~\ref{sec:file_fadvise}) oltre a @@ -914,6 +915,7 @@ valori non garantisce la mappatura della effettiva allocazione dello spazio disco di un file, per il quale esiste una specifica operazione di controllo (vedi sez.~\ref{sec:file_fcntl_ioctl}). +\index{file!\textit{hole}|)} \subsection{Le funzioni per la lettura di un file} @@ -968,12 +970,12 @@ continuare a ricevere zero come valore di ritorno. Con i \textsl{file regolari} questa è l'unica situazione in cui si può avere un numero di byte letti inferiore a quello richiesto, ma questo non è vero -quando si legge da un terminale, da una fifo o da una pipe. In tal caso -infatti, se non ci sono dati in ingresso, la \func{read} si blocca (a meno di -non aver selezionato la modalità non bloccante, vedi -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. +quando si legge da un terminale, da una \textit{fifo} o da una +\textit{pipe}. In tal caso infatti, se non ci sono dati in ingresso, la +\func{read} si blocca (a meno di non aver selezionato la modalità non +bloccante, vedi 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, come vedremo in sez.~\ref{sec:sock_io_behav}), o per la lettura da certi file @@ -1070,10 +1072,10 @@ prototipo è: potuto scrivere qualsiasi dato. \item[\errcode{EINVAL}] \param{fd} è connesso ad un oggetto che non consente la scrittura o si è usato \const{O\_DIRECT} ed il buffer non è allineato. - \item[\errcode{EPIPE}] \param{fd} è connesso ad una pipe il cui altro capo è - chiuso in lettura; in questo caso viene anche generato il segnale - \signal{SIGPIPE}, se questo viene gestito (o bloccato o ignorato) la - funzione ritorna questo errore. + \item[\errcode{EPIPE}] \param{fd} è connesso ad una \textit{pipe} il cui + altro capo è chiuso in lettura; in questo caso viene anche generato il + segnale \signal{SIGPIPE}, se questo viene gestito (o bloccato o ignorato) + la funzione ritorna questo errore. \end{errlist} ed inoltre \errval{EBADF}, \errval{EFAULT}, \errval{EIO}, \errval{EISDIR}, \errval{ENOSPC} nel loro significato generico.} @@ -1313,9 +1315,9 @@ cancellato nel file descriptor restituito come copia. L'uso principale di questa funzione è nella shell per la redirezione dei file standard di tab.~\ref{tab:file_std_files} fra l'esecuzione di una \func{fork} e la successiva \func{exec}. Diventa così possibile associare un file (o una -pipe) allo \itindex{standard~input} \textit{standard input} o allo +\textit{pipe}) allo \itindex{standard~input} \textit{standard input} o allo \itindex{standard~output} \textit{standard output} (vedremo un esempio in -sez.~\ref{sec:ipc_pipe_use}, quando tratteremo le pipe). +sez.~\ref{sec:ipc_pipe_use}, quando tratteremo le \textit{pipe}). Ci si può chiedere perché non sia in questo caso sufficiente chiudere il file standard che si vuole redirigere e poi aprire direttamente con \func{open} il @@ -2178,7 +2180,7 @@ il nome indicato nel precedente prototipo), è riportata di seguito: sufficiente per creare il \textit{file lease}, \errcode{EACCES} se non si è il proprietario del file e non si hanno i privilegi di amministratore.\footnote{per la precisione occorre la capacità - \itindex{capabilities} \const{CAP\_LEASE}.} + \const{CAP\_LEASE}.} Il supporto il supporto per i \textit{file lease}, che consente ad un processo che detiene un \textit{lease} su un file di riceve una notifica @@ -2202,7 +2204,7 @@ il nome indicato nel precedente prototipo), è riportata di seguito: del buffer associato alla \textit{pipe} \param{fd} (vedi sez.~\ref{sec:ipc_pipes}) o $-1$ in caso di errore, il terzo argomento viene ignorato. Non sono previsti errori diversi da \errval{EBADF}, che viene - restituito anche se il file descriptor non è una pipe. Il comando è + restituito anche se il file descriptor non è una \textit{pipe}. Il comando è specifico di Linux, è disponibile solo a partire dal kernel 2.6.35, ed è utilizzabile solo se si è definita la macro \macro{\_GNU\_SOURCE}. @@ -2218,12 +2220,12 @@ il nome indicato nel precedente prototipo), è riportata di seguito: inferiore, il valore specificato viene in genere arrotondato per eccesso al valore ritenuto più opportuno dal sistema, pertanto una volta eseguita la modifica è opportuno rileggere la nuova dimensione con - \const{F\_GETPIPE\_SZ}. I processi non privilegiati\footnote{{per la - precisione occorre la capacità \itindex{capabilities} - \const{CAP\_SYS\_RESOURCE}.}} non possono impostare un valore valore - superiore a quello indicato da \sysctlfile{fs/pipe-size-max}. Il comando è - specifico di Linux, è disponibile solo a partire dal kernel 2.6.35, ed è - utilizzabile solo se si è definita la macro \macro{\_GNU\_SOURCE}. + \const{F\_GETPIPE\_SZ}. I processi non privilegiati\footnote{per la + precisione occorre la capacità \const{CAP\_SYS\_RESOURCE}.} non possono + impostare un valore valore superiore a quello indicato da + \sysctlfile{fs/pipe-size-max}. Il comando è specifico di Linux, è + disponibile solo a partire dal kernel 2.6.35, ed è utilizzabile solo se si è + definita la macro \macro{\_GNU\_SOURCE}. \end{basedescript}