X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=fileunix.tex;h=dde98892019cba1e8b00ee2a7fd87baff995f368;hp=056e3b42b4a5e669c3d00de7d9f80969c1383ba7;hb=5a59e67204ff436dceb6a13ed39e876aea3945a8;hpb=1907c0d00d86100796a3b000827ac9742c4b9d81 diff --git a/fileunix.tex b/fileunix.tex index 056e3b4..dde9889 100644 --- a/fileunix.tex +++ b/fileunix.tex @@ -1,3 +1,13 @@ +%% fileunix.tex +%% +%% Copyright (C) 2000-2002 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 "Prefazione", +%% with no Front-Cover Texts, and with no Back-Cover Texts. A copy of the +%% license is included in the section entitled "GNU Free Documentation +%% License". +%% \chapter{I file: l'interfaccia standard Unix} \label{cha:file_unix_interface} @@ -295,10 +305,10 @@ sempre il file descriptor con il valore pi \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 - file di lock (vedi \secref{sec:ipc_file_lock}) possono incorrere in una race + \textsl{file di lock}\index{file di lock} possono incorrere in una race condition\index{race condition}. Si consiglia come alternativa di usare un file con un nome univoco e la funzione \func{link} per verificarne - l'esistenza.} + l'esistenza (vedi \secref{sec:ipc_file_lock}).} \footnotetext[3]{\textit{Denial of Service}, si chiamano così attacchi miranti ad impedire un servizio causando una qualche forma di carico eccessivo per @@ -485,8 +495,8 @@ Si tenga presente inoltre che usare \macro{SEEK\_END} non assicura affatto che la successiva scrittura avvenga alla fine del file, infatti se questo è stato aperto anche da un altro processo che vi ha scritto, la fine del file può essersi spostata, ma noi scriveremo alla posizione impostata in precedenza -(questa è una potenziale sorgente di \textit{race condition}\index{race - condition}, vedi \secref{sec:file_atomic}). +(questa è una potenziale sorgente di \textit{race condition} +\index{race condition}, vedi \secref{sec:file_atomic}). 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 @@ -767,7 +777,7 @@ problema, quando si andr 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}, che esamineremo in \secref{cha:file_advanced}). + locking}, che esamineremo in \secref{sec:file_locking}). Un caso tipico di necessità di accesso condiviso in scrittura è quello in cui vari processi devono scrivere alla fine di un file (ad esempio un file di @@ -789,17 +799,19 @@ 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 file di lock, bloccandosi se il file esiste. In questo caso la -sequenza logica porterebbe a verificare prima l'esistenza del file con una -\func{stat} per poi crearlo con una \func{creat}; di nuovo avremmo la -possibilità di una race condition\index{race condition} da parte di un altro -processo che crea lo stesso file fra il controllo e la creazione. +creare un \textsl{file di lock}\index{file di lock}, bloccandosi se il file +esiste. In questo caso la sequenza logica porterebbe a verificare prima +l'esistenza del file con una \func{stat} per poi crearlo con una \func{creat}; +di nuovo avremmo la possibilità di una race condition\index{race condition} da +parte di un altro processo che crea lo stesso file fra il controllo e la +creazione. Per questo motivo sono stati introdotti per \func{open} i due flag \macro{O\_CREAT} e \macro{O\_EXCL}. In questo modo l'operazione di controllo dell'esistenza del file (con relativa uscita dalla funzione con un errore) e creazione in caso di assenza, diventa atomica essendo svolta tutta all'interno -di una singola system call. +di una singola system call (per i dettagli sull'uso di questa caratteristica +si veda \secref{sec:ipc_file_lock}). \subsection{La funzioni \func{sync} e \func{fsync}} @@ -833,8 +845,12 @@ La funzione viene usata dal comando \cmd{sync} quando si vuole forzare esplicitamente lo scarico dei dati su disco, o dal demone di sistema \cmd{update} che esegue lo scarico dei dati ad intervalli di tempo fissi: il valore tradizionale, usato da BSD, per l'update dei dati è ogni 30 secondi, ma -in Linux ilvalore utilizzato è di 5 secondi; con le nuove versioni poi, è il -kernel che si occupa direttamente di tutto quanto. +in Linux il valore utilizzato è di 5 secondi; con le nuove versioni\footnote{a + partire dal kernel 2.2.8} poi, è il kernel che si occupa direttamente di +tutto quanto attraverso il demone interno \cmd{bdflush}, il cui comportamento +può essere controllato attraverso il file \file{/proc/sys/vm/bdflush} (per il +significato dei valori si può leggere la documentazione allegata al kernel in +\file{Documentation/sysctl/vm.txt}). Quando si vogliono scaricare soltanto i dati di un file (ad esempio essere sicuri che i dati di un database sono stati registrati su disco) si possono @@ -914,8 +930,9 @@ sull'altro (dato che quello che viene modificato della \textit{file table} a cui entrambi fanno riferimento). L'unica differenza fra due file descriptor duplicati è che ciascuno avrà il suo \textit{file descriptor flag}; a questo proposito va specificato che nel caso -di \func{dup} il flag di \textit{close on exec} viene sempre cancellato nella -copia. +di \func{dup} il flag di \textit{close-on-exec}\index{close-on-exec} (vedi +\secref{sec:proc_exec} e \secref{sec:file_fcntl}) viene sempre cancellato +nella copia. L'uso principale di questa funzione è per la redirezione dell'input e dell'output fra l'esecuzione di una \func{fork} e la successiva \func{exec}; @@ -995,10 +1012,11 @@ valori \macro{EINVAL} se \param{arg} è negativo o maggiore del massimo consentito o \macro{EMFILE} se il processo ha già raggiunto il massimo numero di descrittori consentito. -\item[\macro{F\_SETFD}] imposta il valore del \textit{file descriptor flag} - al valore specificato con \param{arg}. Al momento l'unico bit usato è - quello di \textit{close on exec}, identificato dalla costante - \macro{FD\_CLOEXEC}. +\item[\macro{F\_SETFD}] imposta il valore del \textit{file descriptor flag} al + valore specificato con \param{arg}. Al momento l'unico bit usato è quello di + \textit{close-on-exec}\index{close-on-exec}, identificato dalla costante + \macro{FD\_CLOEXEC}, che serve a richiedere che il file venga chiuso nella + esecuzione di una \func{exec} (vedi \secref{sec:proc_exec}). \item[\macro{F\_GETFD}] ritorna il valore del \textit{file descriptor flag} di \var{fd}, se \macro{FD\_CLOEXEC} è impostato i file descriptor aperti vengono chiusi attraverso una \func{exec} altrimenti (il comportamento