From: Simone Piccardi Date: Mon, 25 Nov 2002 00:20:07 +0000 (+0000) Subject: Ulteriori correzioni da D. Masini X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=commitdiff_plain;h=7b63698a1ef54d7274e2c14065d62260644abde0 Ulteriori correzioni da D. Masini --- diff --git a/filedir.tex b/filedir.tex index 3774978..ac0a3bc 100644 --- a/filedir.tex +++ b/filedir.tex @@ -1181,20 +1181,6 @@ archiviati per il backup. Il comando \cmd{ls} (quando usato con le opzioni \cmd{-l} o \cmd{-t}) mostra i tempi dei file secondo lo schema riportato nell'ultima colonna di \tabref{tab:file_file_times}. -L'effetto delle varie funzioni di manipolazione dei file sui tempi è -illustrato in \tabref{tab:file_times_effects}. Si sono riportati gli effetti -sia per il file a cui si fa riferimento, sia per la directory che lo contiene; -questi ultimi possono essere capiti se si tiene conto di quanto già detto, e -cioè che anche le directory sono file (che contengono una lista di nomi) che -il sistema tratta in maniera del tutto analoga a tutti gli altri. - -Per questo motivo tutte le volte che compiremo un'operazione su un file che -comporta una modifica del nome contenuto nella directory, andremo anche a -scrivere sulla directory che lo contiene cambiandone il tempo di modifica. Un -esempio di questo può essere la cancellazione di un file, invece leggere o -scrivere o cambiare i permessi di un file ha effetti solo sui tempi di -quest'ultimo. - \begin{table}[htb] \centering \footnotesize @@ -1268,6 +1254,20 @@ quest'ultimo. \label{tab:file_times_effects} \end{table} +L'effetto delle varie funzioni di manipolazione dei file sui tempi è +illustrato in \tabref{tab:file_times_effects}. Si sono riportati gli effetti +sia per il file a cui si fa riferimento, sia per la directory che lo contiene; +questi ultimi possono essere capiti se si tiene conto di quanto già detto, e +cioè che anche le directory sono file (che contengono una lista di nomi) che +il sistema tratta in maniera del tutto analoga a tutti gli altri. + +Per questo motivo tutte le volte che compiremo un'operazione su un file che +comporta una modifica del nome contenuto nella directory, andremo anche a +scrivere sulla directory che lo contiene cambiandone il tempo di modifica. Un +esempio di questo può essere la cancellazione di un file, invece leggere o +scrivere o cambiare i permessi di un file ha effetti solo sui tempi di +quest'ultimo. + Si noti infine come \var{st\_ctime} non abbia nulla a che fare con il tempo di creazione del file, usato in molti altri sistemi operativi, ma che in Unix non esiste. Per questo motivo quando si copia un file, a meno di preservare @@ -1982,14 +1982,13 @@ da poter fornire un quadro d'insieme. In \tabref{tab:file_fileperm_bits} si sono riassunti gli effetti dei vari bit per un file; per quanto riguarda l'applicazione dei permessi per proprietario, gruppo ed altri si ricordi quanto illustrato in -\secref{sec:file_perm_overview}. Per compattezza nella tabella si sono -specificati i bit di \acr{suid}, \acr{sgid} e \acr{stiky} con la notazione -illustrata anche in \figref{fig:file_perm_bit}. +\secref{sec:file_perm_overview}. Si rammenti che il valore dei permessi non ha +alcun effetto qualora il processo possieda i privilegi di amministratore. \begin{table}[!htb] \centering \footnotesize - \begin{tabular}[c]{|c|c|c|c|c|c|c|c|c|c|c|c|p{7cm}|} + \begin{tabular}[c]{|c|c|c|c|c|c|c|c|c|c|c|c|l|} \hline \multicolumn{3}{|c|}{}& \multicolumn{3}{|c|}{user}& @@ -2003,15 +2002,15 @@ illustrata anche in \figref{fig:file_perm_bit}. 1&-&-&-&-&-&-&-&-&-&-&-&Se eseguito ha i permessi del propritario\\ -&1&-&-&-&1&-&-&-&-&-&-&Se eseguito ha i permessi del gruppo propritario\\ -&1&-&-&-&0&-&-&-&-&-&-&Il \textit{mandatory locking} è abilitato\\ - -&-&1&-&-&-&-&-&-&-&-&-&Ineffettivo\\ - -&-&-&1&-&-&-&-&-&-&-&-&Permesso di lettura per il propritario\\ - -&-&-&-&1&-&-&-&-&-&-&-&Permesso di lettura per il gruppo propritario\\ + -&-&1&-&-&-&-&-&-&-&-&-&Non utilizzato\\ + -&-&-&1&-&-&-&-&-&-&-&-&Permesso di lettura per il proprietario\\ + -&-&-&-&1&-&-&-&-&-&-&-&Permesso di lettura per il gruppo proprietario\\ -&-&-&-&-&1&-&-&-&-&-&-&Permesso di lettura per tutti gli altri\\ - -&-&-&-&-&-&1&-&-&-&-&-&Permesso di scrittura per il propritario\\ - -&-&-&-&-&-&-&1&-&-&-&-&Permesso di scrittura per il gruppo propritario\\ + -&-&-&-&-&-&1&-&-&-&-&-&Permesso di scrittura per il proprietario\\ + -&-&-&-&-&-&-&1&-&-&-&-&Permesso di scrittura per il gruppo proprietario\\ -&-&-&-&-&-&-&-&1&-&-&-&Permesso di scrittura per tutti gli altri \\ - -&-&-&-&-&-&-&-&-&1&-&-&Permesso di esecuzione per il propritario\\ - -&-&-&-&-&-&-&-&-&-&1&-&Permesso di esecuzione per il gruppo propritario\\ + -&-&-&-&-&-&-&-&-&1&-&-&Permesso di esecuzione per il proprietario\\ + -&-&-&-&-&-&-&-&-&-&1&-&Permesso di esecuzione per il gruppo proprietario\\ -&-&-&-&-&-&-&-&-&-&-&1&Permesso di esecuzione per tutti gli altri\\ \hline \end{tabular} @@ -2020,15 +2019,19 @@ illustrata anche in \figref{fig:file_perm_bit}. \label{tab:file_fileperm_bits} \end{table} -In \tabref{tab:file_dirperm_bits} si sono riassunti gli effetti dei vari bit -per una directory; anche in questo caso si sono specificati i bit di -\acr{suid}, \acr{sgid} e \acr{stiky} con la notazione illustrata anche in +Per compattezza, nella tabella si sono specificati i bit di \acr{suid}, +\acr{sgid} e \acr{stiky} con la notazione illustrata anche in \figref{fig:file_perm_bit}. +In \tabref{tab:file_dirperm_bits} si sono invece riassunti gli effetti dei +vari bit dei permessi per una directory; anche in questo caso si sono +specificati i bit di \acr{suid}, \acr{sgid} e \acr{stiky} con la notazione +compatta illustrata in \figref{fig:file_perm_bit}. + \begin{table}[!htb] \centering \footnotesize - \begin{tabular}[c]{|c|c|c|c|c|c|c|c|c|c|c|c|p{7cm}|} + \begin{tabular}[c]{|c|c|c|c|c|c|c|c|c|c|c|c|l|} \hline \multicolumn{3}{|c|}{}& \multicolumn{3}{|c|}{user}& @@ -2039,19 +2042,18 @@ per una directory; anche in questo caso si sono specificati i bit di \acr{s}&\acr{s}&\acr{t}&r&w&x&r&w&x&r&w&x& \\ \hline \hline - 1&-&-&-&-&-&-&-&-&-&-&-&Se eseguito ha i permessi del propritario\\ - -&1&-&-&-&1&-&-&-&-&-&-&Se eseguito ha i permessi del gruppo propritario\\ - -&1&-&-&-&0&-&-&-&-&-&-&Il \textit{mandatory locking} è abilitato\\ - -&-&1&-&-&-&-&-&-&-&-&-&Ineffettivo\\ - -&-&-&1&-&-&-&-&-&-&-&-&Permesso di lettura per il propritario\\ - -&-&-&-&1&-&-&-&-&-&-&-&Permesso di lettura per il gruppo propritario\\ - -&-&-&-&-&1&-&-&-&-&-&-&Permesso di lettura per tutti gli altri\\ - -&-&-&-&-&-&1&-&-&-&-&-&Permesso di scrittura per il propritario\\ - -&-&-&-&-&-&-&1&-&-&-&-&Permesso di scrittura per il gruppo propritario\\ - -&-&-&-&-&-&-&-&1&-&-&-&Permesso di scrittura per tutti gli altri \\ - -&-&-&-&-&-&-&-&-&1&-&-&Permesso di esecuzione per il propritario\\ - -&-&-&-&-&-&-&-&-&-&1&-&Permesso di esecuzione per il gruppo propritario\\ - -&-&-&-&-&-&-&-&-&-&-&1&Permesso di esecuzione per tutti gli altri\\ + 1&-&-&-&-&-&-&-&-&-&-&-&Non utilizzato\\ + -&1&-&-&-&-&-&-&-&-&-&-&Propaga il gruppo proprietario ai nuovi file creati\\ + -&-&1&-&-&-&-&-&-&-&-&-&Limita l'accesso in scrittura dei file nella directory\\ + -&-&-&1&-&-&-&-&-&-&-&-&Permesso di visualizzazione per il proprietario\\ + -&-&-&-&1&-&-&-&-&-&-&-&Permesso di visualizzazione per il gruppo proprietario\\ + -&-&-&-&-&1&-&-&-&-&-&-&Permesso di visualizzazione per tutti gli altri\\ + -&-&-&-&-&-&1&-&-&-&-&-&Permesso di aggiornamento per il proprietario\\ + -&-&-&-&-&-&-&1&-&-&-&-&Permesso di aggiornamento per il gruppo proprietario\\ + -&-&-&-&-&-&-&-&1&-&-&-&Permesso di aggiornamento per tutti gli altri \\ + -&-&-&-&-&-&-&-&-&1&-&-&Permesso di attraversamento per il proprietario\\ + -&-&-&-&-&-&-&-&-&-&1&-&Permesso di attraversamento per il gruppo proprietario\\ + -&-&-&-&-&-&-&-&-&-&-&1&Permesso di attraversamento per tutti gli altri\\ \hline \end{tabular} \caption{Tabella riassuntiva del significato dei bit dei permessi per una @@ -2059,6 +2061,11 @@ per una directory; anche in questo caso si sono specificati i bit di \label{tab:file_dirperm_bits} \end{table} +Nelle tabelle si è indicato con $-$ il fatto che il valore degli altri bit non +è influente rispetto a quanto indicato in ciascuna riga; l'operazione fa +riferimento soltanto alla combinazione di bit per i quali il valore è +riportato esplicitamente. + \subsection{La funzione \func{chroot}} \label{sec:file_chroot} diff --git a/fileunix.tex b/fileunix.tex index 0f1f225..df4bfb9 100644 --- a/fileunix.tex +++ b/fileunix.tex @@ -320,7 +320,7 @@ visti in \secref{sec:file_std_descr}: se ad esempio si chiude lo standard input e si apre subito dopo un nuovo file questo diventerà il nuovo standard input (avrà cioè il file descriptor 0). -Il nuovo file descriptor non è condiviso con nessun altro processo, (torneremo +Il nuovo file descriptor non è condiviso con nessun altro processo (torneremo sulla condivisione dei file, in genere accessibile dopo una \func{fork}, in \secref{sec:file_sharing}). Il nuovo file descriptor è impostato per restare aperto attraverso una \func{exec} (come accennato in \secref{sec:proc_exec}) e @@ -364,7 +364,7 @@ ciascuno di questi bit. Dette costanti possono essere combinate fra di loro con un OR aritmetico per costruire il valore (in forma di maschera binaria) dell'argomento \param{flags} da passare alla \func{open} per specificarne il comportamento. I due flag \macro{O\_NOFOLLOW} e \macro{O\_DIRECTORY} sono -estensioni specifiche di Linux, e deve essere usata definita la macro +estensioni specifiche di Linux, e deve essere definita la macro \macro{\_GNU\_SOURCE} per poterli usare. Nelle prime versioni di Unix i valori di \param{flag} specificabili per @@ -373,7 +373,7 @@ questo motivo per creare un nuovo file c'era una system call apposita, \func{creat}, il cui prototipo è: \begin{prototype}{fcntl.h} {int creat(const char *pathname, mode\_t mode)} - Crea un nuovo file vuoto, con i permessi specificati da \var{mode}. É del + Crea un nuovo file vuoto, con i permessi specificati da \var{mode}. È del tutto equivalente a \code{open(filedes, O\_CREAT|O\_WRONLY|O\_TRUNC, mode)}. \end{prototype} \noindent adesso questa funzione resta solo per compatibilità con i vecchi @@ -460,16 +460,19 @@ seguenti valori\footnote{per compatibilit questi valori possono essere rimpiazzati rispettivamente con 0, 1 e 2 o con \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. +\item[\macro{SEEK\_SET}] si fa riferimento all'inizio del file: il valore + (sempre positivo) di \param{offset} indica direttamente la nuova posizione + corrente. \item[\macro{SEEK\_CUR}] si fa riferimento alla posizione corrente del file: - \var{offset} può essere negativo e positivo. -\item[\macro{SEEK\_END}] si fa riferimento alla fine del file: il valore di - \var{offset} può essere negativo e positivo. + ad essa viene sommato \param{offset} (che può essere negativo e positivo) + per ottenere la nuova posizione corrente. +\item[\macro{SEEK\_END}] si fa riferimento alla fine del file: alle dimensioni + del file viene sommato \param{offset} (che può essere negativo e positivo) + per ottenere la nuova posizione corrente. \end{basedescript} Come accennato in \secref{sec:file_file_size} con \func{lseek} è possibile -impostare la posizione corrente anche al di la della fine del file, e alla +impostare la posizione corrente anche oltre la fine del file, e alla successiva scrittura il file sarà esteso. La chiamata non causa nessuna attività di input/output, si limita a modificare la posizione corrente nel kernel (cioè \var{f\_pos} in \var{file}, vedi \figref{fig:file_proc_file}). @@ -479,11 +482,11 @@ Dato che la funzione ritorna la nuova posizione, usando il valore zero per funzione con \code{lseek(fd, 0, SEEK\_CUR)}. Si tenga presente inoltre che usare \macro{SEEK\_END} non assicura affatto che -successiva scrittura avvenga alla fine del file, infatti se questo è stato +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}). +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}). 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 @@ -491,7 +494,7 @@ i tre casi citati nel prototipo, vale anche per tutti quei dispositivi che non supportano questa funzione, come ad esempio per i file di terminale.\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 niente al proposito. Infine alcuni file speciali, ad +POSIX però non specifica niente in proposito. Infine alcuni file speciali, ad esempio \file{/dev/null}, non causano un errore ma restituiscono un valore indefinito. @@ -500,8 +503,9 @@ indefinito. \label{sec:file_read} -Una volta che un file è stato aperto su possono leggere i dati che contiene -utilizzando la funzione \func{read}, il cui prototipo è: +Una volta che un file è stato aperto (con il permesso in lettura) su possono +leggere i dati che contiene utilizzando la funzione \func{read}, il cui +prototipo è: \begin{prototype}{unistd.h}{ssize\_t read(int fd, void * buf, size\_t count)} Cerca di leggere \var{count} byte dal file \var{fd} al buffer \var{buf}. @@ -535,7 +539,7 @@ sua fine, e la funzione ritorna regolarmente il numero di byte letti effettivamente. Raggiunta la fine del file, alla ripetizione di un'operazione di lettura, -otterremmo il ritorno immediato di \func{read} con uno zero. La condizione +otterremmo il ritorno immediato di \func{read} con uno zero. La condizione di raggiungimento della fine del file non è un errore, e viene segnalata appunto da un valore di ritorno di \func{read} nullo. Ripetere ulteriormente la lettura non avrebbe nessun effetto se non quello di continuare a ricevere zero @@ -558,15 +562,15 @@ singolo blocco alla volta. In realtà anche le due condizioni segnalate dagli errori \macro{EINTR} e \macro{EAGAIN} non sono errori. La prima si verifica quando la \func{read} è bloccata in attesa di dati in ingresso e viene interrotta da un segnale; in -tal caso l'azione da prendere è quella di rieseguire la funzione. Torneremo in -dettaglio sull'argomento in \secref{sec:sig_gen_beha}. +tal caso l'azione da intraprendere è quella di rieseguire la funzione. +Torneremo in dettaglio sull'argomento in \secref{sec:sig_gen_beha}. La seconda si verifica quando il file è in modalità non bloccante (vedi \secref{sec:file_noblocking}) e non ci sono dati in ingresso: la funzione allora ritorna immediatamente con un errore \macro{EAGAIN}\footnote{sotto BSD - questo per questo errore viene usata la costante \macro{EWOULDBLOCK}, in - Linux, con le glibc, questa è sinonima di \macro{EAGAIN}.} che nel caso -indica soltanto che occorrerà provare a ripetere la lettura. + per questo errore viene usata la costante \macro{EWOULDBLOCK}, in Linux, con + le glibc, questa è sinonima di \macro{EAGAIN}.} che indica soltanto che +occorrerà provare a ripetere la lettura. La funzione \func{read} è una delle system call fondamentali, esistenti fin dagli albori di Unix, ma nella seconda versione delle \textit{Single Unix @@ -593,7 +597,7 @@ Cerca di leggere \var{count} byte dal file \var{fd}, a partire dalla posizione \end{verbatim} Questa funzione serve quando si vogliono leggere dati dal file senza -modificarne la posizione corrente. È equivalente alla esecuzione di una +modificare la posizione corrente. È equivalente all'esecuzione di una \func{read} seguita da una \func{lseek} che riporti al valore precedente la posizione corrente sul file, ma permette di eseguire l'operazione atomicamente. Questo può essere importante quando la posizione sul file viene @@ -604,8 +608,8 @@ condivisa da processi diversi (vedi \secref{sec:file_sharing}). Il valore di \subsection{La funzione \func{write}} \label{sec:file_write} -Una volta che un file è stato aperto su può scrivere su di esso utilizzando la -funzione \func{write}, il cui prototipo è: +Una volta che un file è stato aperto (con il permesso in scrittura) su può +scrivere su di esso utilizzando la funzione \func{write}, il cui prototipo è: \begin{prototype}{unistd.h}{ssize\_t write(int fd, void * buf, size\_t count)} Scrive \var{count} byte dal buffer \var{buf} sul file \var{fd}. @@ -676,7 +680,7 @@ dell'argomento sar \label{sec:file_sharing} In \secref{sec:file_fd} abbiamo descritto brevemente l'architettura -dell'interfaccia coi file da parte di un processo, mostrando in +dell'interfaccia con i file da parte di un processo, mostrando in \figref{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. @@ -736,7 +740,7 @@ riferimento alla stessa voce nella \textit{file table}, condividendo cos posizione corrente sul file. Questo ha le conseguenze descritte a suo tempo in \secref{sec:proc_fork}: in caso di scrittura contemporanea la posizione corrente nel file varierà per entrambi i processi (in quanto verrà modificato -\var{f\_pos} che è la stesso per entrambi). +\var{f\_pos} che è lo stesso per entrambi). Si noti inoltre che anche i flag di stato del file (quelli impostati dall'argomento \param{flag} di \func{open}) essendo tenuti nella voce della @@ -750,10 +754,10 @@ voce della \textit{file table}. -\subsection{Operazioni atomiche coi file} +\subsection{Operazioni atomiche con i file} \label{sec:file_atomic} -Come si è visto in un sistema Unix è sempre possibile per più processi +Come si è visto in un sistema unix-like è sempre possibile per più processi accedere in contemporanea allo stesso file, e che le operazioni di lettura e scrittura possono essere fatte da ogni processo in maniera autonoma in base ad una posizione corrente nel file che è locale a ciascuno di essi. @@ -767,15 +771,14 @@ utilizzare meccanismi di sincronizzazione pi 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 -log). Come accennato in \secref{sec:file_lseek} impostare la posizione alla fine -del file e poi scrivere può condurre ad una -\textit{race condition}\index{race condition}: -infatti può succedere che un secondo processo scriva alla fine -del file fra la \func{lseek} e la \func{write}; in questo caso, come abbiamo -appena visto, il file sarà esteso, ma il nostro primo processo avrà ancora la -posizione corrente impostata con la \func{lseek} che non corrisponde più alla -fine del file, e la successiva \func{write} sovrascriverà i dati del secondo -processo. +log). Come accennato in \secref{sec:file_lseek} impostare la posizione alla +fine del file e poi scrivere può condurre ad una \textit{race + condition}\index{race condition}: infatti può succedere che un secondo +processo scriva alla fine del file fra la \func{lseek} e la \func{write}; in +questo caso, come abbiamo appena visto, il file sarà esteso, ma il nostro +primo processo avrà ancora la posizione corrente impostata 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 è un'operazione atomica; il problema è stato risolto introducendo la modalità @@ -792,7 +795,7 @@ sequenza logica porterebbe a verificare prima l'esistenza del file con una 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 pe \func{open} i due flag +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 @@ -810,10 +813,11 @@ 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 - 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 -funzioni è \func{sync} il cui prototipo è: + questo dà la garanzia assoluta che i dati siano integri dopo la chiamata, + l'hardware dei dischi è in genere dotato di un suo meccanismo interno di + ottimizzazione per l'accesso al disco che può ritardare ulteriormente la + scrittura effettiva.} La prima di queste funzioni è \func{sync} il cui +prototipo è: \begin{prototype}{unistd.h}{int sync(void)} Sincronizza il buffer della cache dei file col disco. @@ -843,7 +847,7 @@ usare le due funzioni \func{fsync} e \func{fdatasync}, i cui prototipi sono: Sincronizza i dati del file \param{fd}. \bodydesc{La funzione ritorna 0 in caso di successo e -1 in caso di errore, - nel qual caso i codici restituiti in \var{errno} sono: + nel qual caso \var{errno} assume i valori: \begin{errlist} \item[\macro{EINVAL}] \param{fd} è un file speciale che non supporta la sincronizzazione.