X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=fileunix.tex;h=cacce238b486c7ad5e557067b3341e1c1530f710;hp=e99db645c82b063a12aba310d51f619567a085b4;hb=7090500d79c488db306ed0c065b90bb0c0505430;hpb=12f3d0def93dbdf672e012934826df53c44a79a6 diff --git a/fileunix.tex b/fileunix.tex index e99db64..cacce23 100644 --- a/fileunix.tex +++ b/fileunix.tex @@ -1,4 +1,4 @@ -\chapter{I file: l'interfaccia standard unix} +\chapter{I file: l'interfaccia standard Unix} \label{cha:file_unix_interface} Esamineremo in questo capitolo la prima delle due interfacce di programmazione @@ -68,7 +68,7 @@ file, fra cui: campo \var{f\_pos}). \item un puntatore all'inode\footnote{nel kernel 2.4.x si è in realtà passati ad un puntatore ad una struttura \var{dentry} che punta a sua volta - all'inode passando per la nuova struttura del VFS} del file. + 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 \secref{sec:file_vfs_work}} che si possono usare % sul file. @@ -153,7 +153,7 @@ restano i limiti imposti dall'amministratore (vedi \secref{sec:sys_limits}). \section{Le funzioni base} \label{sec:file_base_func} -L'interfaccia standard unix per l'input/output sui file è basata su cinque +L'interfaccia standard Unix per l'input/output sui file è basata su cinque funzioni fondamentali: \func{open}, \func{read}, \func{write}, \func{lseek} e \func{close}, usate rispettivamente per aprire, leggere, scrivere, spostarsi e chiudere un file. @@ -245,7 +245,7 @@ sempre il file descriptor con il valore pi zero. Se il file è un terminale o una fifo il flag verrà ignorato, negli altri casi il comportamento non è specificato. \\ \macro{O\_NOFOLLOW} & se \var{pathname} è un link simbolico la chiamata - fallisce. Questa è una estensione BSD aggiunta in Linux dal kernel 2.1.126. + fallisce. Questa è un'estensione BSD aggiunta in Linux dal kernel 2.1.126. Nelle versioni precedenti i link simbolici sono sempre seguiti, e questa opzione è ignorata. \\ \macro{O\_DIRECTORY} & se \var{pathname} non è una directory la chiamata @@ -303,7 +303,7 @@ sempre il file descriptor con il valore pi \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 - una ambiguità, dato che come vedremo in \secref{sec:file_read} il ritorno di + un'ambiguità, dato che come vedremo in \secref{sec:file_read} il ritorno di zero da parte di \func{read} ha il significato di una end-of-file.} Questa caratteristica permette di prevedere qual'è il valore del file @@ -450,7 +450,7 @@ La nuova posizione sommato al riferimento dato da \param{whence}; quest'ultimo può assumere i seguenti valori\footnote{per compatibilità con alcune vecchie notazioni questi valori possono essere rimpiazzati rispettivamente con 0, 1 e 2 o con - \macro{L\_SET}, \macro{L\_INCR} e \macro{L\_XTND}}: + \macro{L\_SET}, \macro{L\_INCR} e \macro{L\_XTND}.}: \begin{basedescript}{\desclabelwidth{2.0cm}} \item[\macro{SEEK\_SET}] si fa riferimento all'inizio del file: il valore di \var{offset} è la nuova posizione. @@ -480,9 +480,9 @@ essersi spostata, ma noi scriveremo alla posizione settata in precedenza. Non tutti i file supportano la capacità di eseguire una \func{lseek}, in questo caso la funzione ritorna l'errore \macro{EPIPE}. Questo, oltre che per i tre casi citati nel prototipo, vale anche per tutti quei dispositivi che non -supportano questa funzione, come ad esempio per le \acr{tty}\footnote{altri +supportano questa funzione, come ad esempio per le \acr{tty}.\footnote{altri sistemi, usando \macro{SEEK\_SET}, in questo caso ritornano il numero di - caratteri che vi sono stati scritti}. Lo standard POSIX però non specifica + caratteri che vi sono stati scritti.} Lo standard POSIX però non specifica niente al proposito. Infine alcuni device, ad esempio \file{/dev/null}, non causano un errore ma restituiscono un valore indefinito. @@ -563,7 +563,7 @@ Nella seconda versione delle \textit{Single Unix Specification}\footnote{questa funzione, e l'analoga \func{pwrite} sono state aggiunte nel kernel 2.1.60, il supporto nelle \acr{glibc}, compresa l'emulazione per i vecchi kernel che non hanno la system call, è stato - aggiunto con la versione 2.1} (quello che viene chiamato normalmente Unix98, + aggiunto con la versione 2.1.} (quello che viene chiamato normalmente Unix98, vedi \secref{sec:intro_opengroup}) è stata introdotta la definizione di un'altra funzione di lettura, \func{pread}, che diventa accessibile con la definizione: @@ -636,7 +636,7 @@ i file ordinari il numero di byte scritti da \var{count}, a meno di un errore. Negli altri casi si ha lo stesso comportamento di \func{read}. -Anche per \func{write} lo standard Unix98 definisce una analoga \func{pwrite} +Anche per \func{write} lo standard Unix98 definisce un'analoga \func{pwrite} per scrivere alla posizione indicata senza modificare la posizione corrente nel file, il suo prototipo è: \begin{prototype}{unistd.h} @@ -731,7 +731,7 @@ corrente nel file varier Si noti inoltre che anche i flag di stato del file (quelli settati 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 - \var{file}}, vengono in questo caso condivisi. Ai file però sono associati + \var{file}.}, vengono in questo caso condivisi. Ai file però sono associati anche altri flag, dei quali l'unico usato al momento è \macro{FD\_CLOEXEC}, detti \textit{file descriptor flags}. Questi ultimi sono tenuti invece in \var{file\_struct}, e perciò sono specifici di ciascun processo e non vengono @@ -765,14 +765,13 @@ file sar corrente settata con la \func{lseek} che non corrisponde più alla fine del file, e la successiva \func{write} sovrascriverà i dati del secondo processo. -Il problema è che usare due system call in successione non è una operazione +Il problema è che usare due system call in successione non è un'operazione atomica; il problema è stato risolto introducendo la modalità \macro{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 una operazione -atomica. +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 file di lock, bloccandosi se il file esiste. In questo caso la @@ -798,10 +797,10 @@ secondo tempo rispetto al momento della esecuzione della \func{write}. Per questo motivo, quando è necessaria una sincronizzazione dei dati, il sistema mette a disposizione delle funzioni che provvedono a forzare lo -scarico dei dati dai buffer del kernel\footnote{come già accennato neanche +scarico dei dati dai buffer del kernel.\footnote{come già accennato neanche questo da la garanzia assoluta che i dati siano integri dopo la chiamata, l'hardware dei dischi è in genere dotato di un suo meccanismo interno che - può ritardare ulteriormente la scrittura effettiva.}. La prima di queste + può ritardare ulteriormente la scrittura effettiva.} La prima di queste funzioni è \func{sync} il cui prototipo è: \begin{prototype}{unistd.h}{int sync(void)} @@ -847,10 +846,10 @@ di \var{fstat} come i tempi del file). Si tenga presente che questo non comporta la sincronizzazione della directory che contiene il file (e scrittura della relativa voce su -disco) che deve essere effettuata esplicitamente\footnote{in realtà per +disco) che deve essere effettuata esplicitamente.\footnote{in realtà per il filesystem \acr{ext2}, quando lo si monta con l'opzione \cmd{sync}, il kernel provvede anche alla sincronizzazione automatica delle voci - delle directory.}. + delle directory.} \subsection{La funzioni \func{dup} e \func{dup2}} @@ -1026,7 +1025,7 @@ avanti quando affronteremo le problematiche ad esse relative. Per determinare le modalità di accesso inoltre è necessario estrarre i bit di accesso (ottenuti con il comando \macro{F\_GETFL}); infatti la definizione corrente non assegna bit separati a \macro{O\_RDONLY}, \macro{O\_WRONLY} e -\macro{O\_RDWR}\footnote{posti rispettivamente ai valori 0, 1 e 2}, per cui il +\macro{O\_RDWR},\footnote{posti rispettivamente ai valori 0, 1 e 2.} per cui il valore si ottiene eseguendo un AND binario del valore di ritorno di \func{fcntl} con la maschera \macro{O\_ACCMODE} anch'essa definita in \file{fcntl.h}.