Merge branch 'master' of ssh://gapil.gnulinux.it/srv/git/gapil
[gapil.git] / fileio.tex
index 59efa4436d6d4f2303cf54bb51900da1df93430a..6639ac357a5113b5e0f4202eff1561d0afdc9443 100644 (file)
@@ -1,4 +1,4 @@
-%% fileio.tex (merge fileunix.tex - filestd.tex)
+s%% fileio.tex (merge fileunix.tex - filestd.tex)
 %%
 %% Copyright (C) 2000-2019 Simone Piccardi.  Permission is granted to
 %% copy, distribute and/or modify this document under the terms of the GNU Free
 %%
 %% Copyright (C) 2000-2019 Simone Piccardi.  Permission is granted to
 %% copy, distribute and/or modify this document under the terms of the GNU Free
@@ -2857,8 +2857,8 @@ Per le operazioni di manipolazione e di controllo delle varie proprietà e
 caratteristiche di un file descriptor, viene usata la funzione di sistema
 \funcd{fcntl},\footnote{ad esempio si gestiscono con questa funzione varie
   modalità di I/O asincrono (vedi sez.~\ref{sec:file_asyncronous_operation}) e
 caratteristiche di un file descriptor, viene usata la funzione di sistema
 \funcd{fcntl},\footnote{ad esempio si gestiscono con questa funzione varie
   modalità di I/O asincrono (vedi sez.~\ref{sec:file_asyncronous_operation}) e
-  il \textit{file locking} (vedi sez.~\ref{sec:file_locking}).} il cui
-prototipo è:
+  il \textit{file locking} (vedi sez.~\ref{sec:file_locking}) e altre
+  funzionalità avanzate che tratteremo più avanti.} il cui prototipo è:
 
 \begin{funcproto}{
 \fhead{unistd.h}
 
 \begin{funcproto}{
 \fhead{unistd.h}
@@ -2866,13 +2866,13 @@ prototipo è:
 \fdecl{int fcntl(int fd, int cmd)}
 \fdecl{int fcntl(int fd, int cmd, int arg)}
 \fdecl{int fcntl(int fd, int cmd, ...)}
 \fdecl{int fcntl(int fd, int cmd)}
 \fdecl{int fcntl(int fd, int cmd, int arg)}
 \fdecl{int fcntl(int fd, int cmd, ...)}
-\fdesc{Esegue una operazione di controllo sul file.} 
+\fdesc{Esegue una operazione di controllo su un file descriptor.} 
 }
 
 {La funzione ha valori di ritorno diversi a seconda dell'operazione richiesta
   in caso di successo mentre ritorna sempre $-1$ per un errore, nel qual caso
   \var{errno} assumerà valori diversi che dipendono dal tipo di operazione,
 }
 
 {La funzione ha valori di ritorno diversi a seconda dell'operazione richiesta
   in caso di successo mentre ritorna sempre $-1$ per un errore, nel qual caso
   \var{errno} assumerà valori diversi che dipendono dal tipo di operazione,
-  gli unici con signifiato generico sono:
+  gli unici con significato generico sono:
   \begin{errlist}
   \item[\errcode{EBADF}] \param{fd} non è un file aperto.
   \item[\errcode{EINVAL}] \param{cmd} non è un comando supportato dal kernel
   \begin{errlist}
   \item[\errcode{EBADF}] \param{fd} non è un file aperto.
   \item[\errcode{EINVAL}] \param{cmd} non è un comando supportato dal kernel
@@ -2964,9 +2964,9 @@ il nome indicato nel precedente prototipo), è riportata di seguito:
 \item[\constd{F\_GETLK}] richiede un controllo sul \textit{file lock}
   specificato nella struttura \struct{flock} puntata dal terzo argomento (che
   pertanto dovrà essere di tipo \ctyp{struct flock *}) sovrascrivendone il
 \item[\constd{F\_GETLK}] richiede un controllo sul \textit{file lock}
   specificato nella struttura \struct{flock} puntata dal terzo argomento (che
   pertanto dovrà essere di tipo \ctyp{struct flock *}) sovrascrivendone il
-  contenuto con il risultato, ritorna un valore nullo in caso di successo o
+  contenuto con il risultato; ritorna un valore nullo in caso di successo o
   $-1$ in caso di errore. Come per i due successivi comandi oltre a
   $-1$ in caso di errore. Come per i due successivi comandi oltre a
-  \errval{EBADF} se il terzo argomento non è un puntatore valido restituisce
+  \errval{EBADF}, se il terzo argomento non è un puntatore valido, restituisce
   l'errore generico \errcode{EFAULT}. Questa funzionalità è trattata in
   dettaglio in sez.~\ref{sec:file_posix_lock}.
 
   l'errore generico \errcode{EFAULT}. Questa funzionalità è trattata in
   dettaglio in sez.~\ref{sec:file_posix_lock}.
 
@@ -3083,8 +3083,8 @@ il nome indicato nel precedente prototipo), è riportata di seguito:
   l'identificatore del processo, \textit{thread} o \textit{process group} che
   è preposto alla ricezione dei segnali \signal{SIGIO} e \signal{SIGURG} per
   gli eventi associati al file descriptor \param{fd}.  Ritorna un valore nullo
   l'identificatore del processo, \textit{thread} o \textit{process group} che
   è preposto alla ricezione dei segnali \signal{SIGIO} e \signal{SIGURG} per
   gli eventi associati al file descriptor \param{fd}.  Ritorna un valore nullo
-  in caso di successo o $-1$ in caso di errore. Oltre a \errval{EBADF} e da
-  \errval{EFAULT} se \param{owner} non è un puntatore valido.
+  in caso di successo o $-1$ in caso di errore. Oltre a \errval{EBADF} l'unico
+  altro errore è \errval{EFAULT} se \param{owner} non è un puntatore valido.
 
   Il comando, che è disponibile solo a partire dal kernel 2.6.32, effettua lo
   stesso compito di \const{F\_GETOWN} di cui costituisce una evoluzione che
 
   Il comando, che è disponibile solo a partire dal kernel 2.6.32, effettua lo
   stesso compito di \const{F\_GETOWN} di cui costituisce una evoluzione che
@@ -3115,8 +3115,8 @@ il nome indicato nel precedente prototipo), è riportata di seguito:
   un tipo di identificatore valido.
 
   Come \const{F\_GETOWN\_EX} il comando richiede come terzo argomento il
   un tipo di identificatore valido.
 
   Come \const{F\_GETOWN\_EX} il comando richiede come terzo argomento il
-  puntatore ad una struttura \struct{f\_owner\_ex} la cui definizione è
-  riportata in fig.~\ref{fig:f_owner_ex}, in cui il campo \var{type} indica il
+  puntatore ad una struttura \struct{f\_owner\_ex} (la cui definizione è
+  riportata in fig.~\ref{fig:f_owner_ex}) in cui il campo \var{type} indica il
   tipo di identificatore che si intende usare, mentre il relativo valore è
   specificato nel campo \var{pid}, che assume lo stesso significato del terzo
   argomenti di \const{F\_SETOWN}.
   tipo di identificatore che si intende usare, mentre il relativo valore è
   specificato nel campo \var{pid}, che assume lo stesso significato del terzo
   argomenti di \const{F\_SETOWN}.
@@ -3128,18 +3128,19 @@ il nome indicato nel precedente prototipo), è riportata di seguito:
   di \const{F\_SETOWN} se si specifica un \textit{Tread ID} questo riceverà
   sia \signal{SIGIO} (o il segnale impostato con \const{F\_SETSIG}) che
   \signal{SIGURG}. Il comando è specifico di Linux, è disponibile solo a
   di \const{F\_SETOWN} se si specifica un \textit{Tread ID} questo riceverà
   sia \signal{SIGIO} (o il segnale impostato con \const{F\_SETSIG}) che
   \signal{SIGURG}. Il comando è specifico di Linux, è disponibile solo a
-  partire dal kernel 2.6.32, ed è utilizzabile solo se si è definita la macro
+  partire dal kernel 2.6.32 ed è utilizzabile solo se si è definita la macro
   \macro{\_GNU\_SOURCE}.
 
   \macro{\_GNU\_SOURCE}.
 
-\item[\constd{F\_GETSIG}] restituisce il valore del segnale inviato dai vari
-  meccanismi di I/O asincrono associati al file descriptor \param{fd} (quelli
-  trattati in sez.~\ref{sec:file_asyncronous_operation}) in caso di successo o
-  $-1$ in caso di errore, il terzo argomento viene ignorato. Non sono previsti
-  errori diversi da \errval{EBADF}.  Un valore nullo indica che si sta usando
-  il segnale predefinito, che è \signal{SIGIO}. Un valore diverso da zero
-  indica il segnale che è stato impostato con \const{F\_SETSIG}, che può
-  essere anche lo stesso \signal{SIGIO}. Il comando è specifico di Linux ed
-  utilizzabile solo se si è definita la macro \macro{\_GNU\_SOURCE}.
+\item[\constd{F\_GETSIG}] restituisce in caso di successo il valore del
+  segnale inviato dai vari meccanismi di I/O asincrono associati al file
+  descriptor \param{fd} (quelli trattati in
+  sez.~\ref{sec:file_asyncronous_operation}) o $-1$ in caso di errore, il
+  terzo argomento viene ignorato. Non sono previsti errori diversi da
+  \errval{EBADF}.  Un valore nullo indica che si sta usando il segnale
+  predefinito, che è \signal{SIGIO}. Un valore diverso da zero indica il
+  segnale che è stato impostato con \const{F\_SETSIG}, che può essere anche lo
+  stesso \signal{SIGIO}. Il comando è specifico di Linux ed utilizzabile solo
+  se si è definita la macro \macro{\_GNU\_SOURCE}.
 
 \item[\constd{F\_SETSIG}] imposta il segnale inviato dai vari meccanismi di
   I/O asincrono associati al file descriptor \param{fd} (quelli trattati in
 
 \item[\constd{F\_SETSIG}] imposta il segnale inviato dai vari meccanismi di
   I/O asincrono associati al file descriptor \param{fd} (quelli trattati in
@@ -3177,15 +3178,16 @@ il nome indicato nel precedente prototipo), è riportata di seguito:
   valori di tab.~\ref{tab:file_lease_fctnl}), \errcode{ENOMEM} se non c'è
   memoria sufficiente per creare il \textit{file lease}, \errcode{EACCES} se
   non si è il proprietario del file e non si hanno i privilegi di
   valori di tab.~\ref{tab:file_lease_fctnl}), \errcode{ENOMEM} se non c'è
   memoria sufficiente per creare il \textit{file lease}, \errcode{EACCES} se
   non si è il proprietario del file e non si hanno i privilegi di
-  amministratore (per la precisione occorre la capacità \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
-  qualora un altro processo cerchi di eseguire una \func{open} o una
-  \func{truncate} su di esso è stato introdotto a partire dai kernel della
-  serie 2.4 Il comando è specifico di Linux ed utilizzabile solo se si è
-  definita la macro \macro{\_GNU\_SOURCE}. Questa funzionalità è trattata in
-  dettaglio in sez.~\ref{sec:file_asyncronous_lease}.
+  amministratore (per la precisione occorre la capacità \const{CAP\_LEASE},
+  vedi sez.~\ref{sec:proc_capabilities}).
+
+  Il supporto per i \textit{file lease}, che consente ad un processo che
+  detiene un \textit{lease} su un file di ricevere una notifica qualora un
+  altro processo cerchi di eseguire una \func{open} o una \func{truncate} su
+  di esso, è stato introdotto a partire dai kernel della serie 2.4. Il comando
+  è specifico di Linux ed utilizzabile solo se si è definita la macro
+  \macro{\_GNU\_SOURCE}. Questa funzionalità è trattata in dettaglio in
+  sez.~\ref{sec:file_asyncronous_lease}.
 
 \item[\constd{F\_NOTIFY}] attiva il meccanismo di notifica asincrona per cui
   viene riportato al processo chiamante, tramite il segnale \signal{SIGIO} (o
 
 \item[\constd{F\_NOTIFY}] attiva il meccanismo di notifica asincrona per cui
   viene riportato al processo chiamante, tramite il segnale \signal{SIGIO} (o
@@ -3222,27 +3224,25 @@ il nome indicato nel precedente prototipo), è riportata di seguito:
 
   I processi non privilegiati (occorre la capacità \const{CAP\_SYS\_RESOURCE})
   non possono impostare un valore superiore a quello indicato da
 
   I processi non privilegiati (occorre la capacità \const{CAP\_SYS\_RESOURCE})
   non possono impostare un valore superiore a quello indicato da
-  \sysctlfiled{fs/pipe-size-max}.  Il comando è specifico di Linux, è
+  \sysctlfiled{fs/pipe-max-size}.  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}.
 
 \item[\constd{F\_GET\_SEALS}] restituisce in caso di successo l'insieme dei
   disponibile solo a partire dal kernel 2.6.35, ed è utilizzabile solo se si è
   definita la macro \macro{\_GNU\_SOURCE}.
 
 \item[\constd{F\_GET\_SEALS}] restituisce in caso di successo l'insieme dei
-  \textit{file seal} presenti su \param{fd}, 0 se non ve ne sono o $-1$ in
+  \textit{file seal} presenti su \param{fd}: 0 se non ve ne sono o $-1$ in
   caso di errore, il terzo argomento viene ignorato.  Oltre a \errval{EBADF}
   se il file non supporta i \textit{file seal} viene restituito un errore di
   \errval{EINVAL}. Il comando è specifico di Linux, è disponibile solo a
   partire dal kernel 3.17. Questa funzionalità è trattata in dettaglio in
   caso di errore, il terzo argomento viene ignorato.  Oltre a \errval{EBADF}
   se il file non supporta i \textit{file seal} viene restituito un errore di
   \errval{EINVAL}. Il comando è specifico di Linux, è disponibile solo a
   partire dal kernel 3.17. Questa funzionalità è trattata in dettaglio in
-  sez.~\ref{sec:file_seal}.
+  sez.~\ref{sec:file_seal_et_al}.
 
 \item[\constd{F\_ADD\_SEALS}] aggiunge i \textit{file seal} espressi come
   maschera binaria nell'argomento \param{arg} a quelli presenti su \param{fd},
   ritorna un valore nullo in caso di successo o $-1$ in caso di errore. Il
   comando è specifico di Linux, è disponibile solo a partire dal kernel
   3.17. Questa funzionalità è trattata in dettaglio in
 
 \item[\constd{F\_ADD\_SEALS}] aggiunge i \textit{file seal} espressi come
   maschera binaria nell'argomento \param{arg} a quelli presenti su \param{fd},
   ritorna un valore nullo in caso di successo o $-1$ in caso di errore. Il
   comando è specifico di Linux, è disponibile solo a partire dal kernel
   3.17. Questa funzionalità è trattata in dettaglio in
-  sez.~\ref{sec:file_seal}.
+  sez.~\ref{sec:file_seal_et_al}.
   
   
-  % TODO: trovare dove trattare i file seal
-
 \item[\constd{F\_GET\_RW\_HINT}] legge il valore dei \textit{read/write hints}
   associati all'\textit{inode} a cui fa riferimento \param{fd} nella variabile
   puntata dal terzo argomento che deve essere di tipo \ctyp{uint64\_t
 \item[\constd{F\_GET\_RW\_HINT}] legge il valore dei \textit{read/write hints}
   associati all'\textit{inode} a cui fa riferimento \param{fd} nella variabile
   puntata dal terzo argomento che deve essere di tipo \ctyp{uint64\_t
@@ -3278,9 +3278,6 @@ il nome indicato nel precedente prototipo), è riportata di seguito:
 \end{basedescript}
 
 
 \end{basedescript}
 
 
-% TODO: trattare RWH_WRITE_LIFE_EXTREME e RWH_WRITE_LIFE_SHORT aggiunte con
-% il kernel 4.13 (vedi https://lwn.net/Articles/727385/)
-
 La maggior parte delle funzionalità controllate dai comandi di \func{fcntl}
 sono avanzate e richiedono degli approfondimenti ulteriori, saranno pertanto
 riprese più avanti quando affronteremo le problematiche ad esse relative. In
 La maggior parte delle funzionalità controllate dai comandi di \func{fcntl}
 sono avanzate e richiedono degli approfondimenti ulteriori, saranno pertanto
 riprese più avanti quando affronteremo le problematiche ad esse relative. In
@@ -3288,7 +3285,7 @@ particolare le tematiche relative all'I/O asincrono e ai vari meccanismi di
 notifica saranno trattate in maniera esaustiva in
 sez.~\ref{sec:file_asyncronous_operation}, quelle relative al \textit{file
   locking} saranno esaminate in sez.~\ref{sec:file_locking}, quelle relative
 notifica saranno trattate in maniera esaustiva in
 sez.~\ref{sec:file_asyncronous_operation}, quelle relative al \textit{file
   locking} saranno esaminate in sez.~\ref{sec:file_locking}, quelle relative
-ai \textit{file seal} in sez.~\ref{sec:file_seal} e quelle relative ai
+ai \textit{file seal} in sez.~\ref{sec:file_seal_et_al} e quelle relative ai
 \textit{read/write hints} in sez.~\ref{sec:file_fadvise}. L'uso di questa
 funzione con i socket verrà trattato in sez.~\ref{sec:sock_ctrl_func}.
 
 \textit{read/write hints} in sez.~\ref{sec:file_fadvise}. L'uso di questa
 funzione con i socket verrà trattato in sez.~\ref{sec:sock_ctrl_func}.
 
@@ -3355,16 +3352,16 @@ sistematica le operazioni che si possono gestire con \func{ioctl}, un breve
 elenco di alcuni esempi di esse è il seguente:
 \begin{itemize*}
 \item il cambiamento dei font di un terminale.
 elenco di alcuni esempi di esse è il seguente:
 \begin{itemize*}
 \item il cambiamento dei font di un terminale.
-\item l'esecuzione di una traccia audio di un CDROM.
+\item l'esecuzione di una traccia audio di un CD.
 \item i comandi di avanti veloce e di riavvolgimento di un nastro.
 \item il comando di espulsione di un dispositivo rimovibile.
 \item l'impostazione della velocità trasmissione di una linea seriale.
 \item l'impostazione della frequenza e della durata dei suoni emessi dallo
   speaker.
 \item i comandi di avanti veloce e di riavvolgimento di un nastro.
 \item il comando di espulsione di un dispositivo rimovibile.
 \item l'impostazione della velocità trasmissione di una linea seriale.
 \item l'impostazione della frequenza e della durata dei suoni emessi dallo
   speaker.
-\item l'impostazione degli attributi dei file su un filesystem
-  ext2.\footnote{i comandi \texttt{lsattr} e \texttt{chattr} fanno questo con
-    delle \func{ioctl} dedicate, usabili solo su questo filesystem e derivati
-    successivi (come ext3).}
+\item l'impostazione degli attributi dei file (vedi
+  sez.~\ref{sec:file_perm_management}) su un filesystem.\footnote{i comandi
+    \texttt{lsattr} e \texttt{chattr} fanno questo con delle \func{ioctl}
+    dedicate, usabili solo sui filesystem che li supportano.}
 \end{itemize*}
 
 In generale ogni dispositivo ha un suo insieme di operazioni specifiche
 \end{itemize*}
 
 In generale ogni dispositivo ha un suo insieme di operazioni specifiche
@@ -3453,7 +3450,6 @@ due funzioni sono rimaste.
 %  EXT4_IOC_SHUTDOWN (dal 4.10), XFS_IOC_GOINGDOWN e futura FS_IOC_SHUTDOWN
 % ioctl di btrfs, vedi http://lwn.net/Articles/580732/
 
 %  EXT4_IOC_SHUTDOWN (dal 4.10), XFS_IOC_GOINGDOWN e futura FS_IOC_SHUTDOWN
 % ioctl di btrfs, vedi http://lwn.net/Articles/580732/
 
-% \chapter{}
 
 \section{L'interfaccia standard ANSI C}
 \label{sec:files_std_interface}
 
 \section{L'interfaccia standard ANSI C}
 \label{sec:files_std_interface}
@@ -3470,9 +3466,10 @@ standard (che sono state implementate la prima volta da Ritchie nel 1976 e da
 allora sono rimaste sostanzialmente immutate), vengono a costituire il nucleo
 della \acr{glibc} per la gestione dei file.
 
 allora sono rimaste sostanzialmente immutate), vengono a costituire il nucleo
 della \acr{glibc} per la gestione dei file.
 
-Esamineremo in questa sezione le funzioni base dell'interfaccia degli
-\textit{stream}, analoghe a quelle di sez.~\ref{sec:file_unix_interface} per i
-file descriptor. In particolare vedremo come aprire, leggere, scrivere e
+Esamineremo in questa sezione le funzioni base di questa interfaccia che
+chiameremo, per distinguerla dalla precedente ``degli \textit{stream}''. Esse
+sono analoghe a quelle di sez.~\ref{sec:file_unix_interface} per i file
+descriptor, ed in particolare vedremo come aprire, leggere, scrivere e
 cambiare la posizione corrente in uno \textit{stream}.
 
 
 cambiare la posizione corrente in uno \textit{stream}.
 
 
@@ -3721,7 +3718,16 @@ essere aperti con le funzioni delle librerie standard del C.
                  scrittura.\\
     \hline
     \texttt{b} & Specifica che il file è binario, non ha alcun effetto. \\
                  scrittura.\\
     \hline
     \texttt{b} & Specifica che il file è binario, non ha alcun effetto. \\
-    \texttt{x} & L'apertura fallisce se il file esiste già. \\
+    \texttt{c} & Evita che l'apertura e seguenti letture o scritture diventino
+                 un \textit{cancellation point} per i \textit{thread};
+                 presente dalla \acr{glibc} 2.3.3. \\
+    \texttt{e} & Apre il file con il flag di \const{O\_CLOEXEC}; presente
+                 dalla \acr{glibc} 2.7. \\
+    \texttt{m} & Cerca di accedere al file con \func{mmap} invece
+                 che con le funzioni di I/O classiche; presente
+                 dalla \acr{glibc} 2.3. \\
+    \texttt{x} & L'apertura fallisce se il file esiste già (ignorato con
+                 \func{fdopen}).\\
     \hline
   \end{tabular}
   \caption{Modalità di apertura di uno \textit{stream} dello standard ANSI C
     \hline
   \end{tabular}
   \caption{Modalità di apertura di uno \textit{stream} dello standard ANSI C
@@ -3732,24 +3738,35 @@ essere aperti con le funzioni delle librerie standard del C.
 In realtà lo standard ANSI C prevede un totale di 15 possibili valori
 diversi per \param{mode}, ma in tab.~\ref{tab:file_fopen_mode} si sono
 riportati solo i sei valori effettivi, ad essi può essere aggiunto pure
 In realtà lo standard ANSI C prevede un totale di 15 possibili valori
 diversi per \param{mode}, ma in tab.~\ref{tab:file_fopen_mode} si sono
 riportati solo i sei valori effettivi, ad essi può essere aggiunto pure
-il carattere \texttt{b} (come ultimo carattere o nel mezzo agli altri per
+il carattere ``\texttt{b}'' (come ultimo carattere o nel mezzo agli altri per
 le stringhe di due caratteri) che in altri sistemi operativi serve a
 distinguere i file binari dai file di testo; in un sistema POSIX questa
 distinzione non esiste e il valore viene accettato solo per
 compatibilità, ma non ha alcun effetto.
 
 La \acr{glibc} supporta alcune estensioni, queste devono essere sempre
 le stringhe di due caratteri) che in altri sistemi operativi serve a
 distinguere i file binari dai file di testo; in un sistema POSIX questa
 distinzione non esiste e il valore viene accettato solo per
 compatibilità, ma non ha alcun effetto.
 
 La \acr{glibc} supporta alcune estensioni, queste devono essere sempre
-indicate dopo aver specificato il \param{mode} con uno dei valori di
-tab.~\ref{tab:file_fopen_mode}. L'uso del carattere \texttt{x} serve per
-evitare di sovrascrivere un file già esistente (è analoga all'uso dell'opzione
-\const{O\_EXCL} in \func{open}): se il file specificato già esiste e si
-aggiunge questo carattere a \param{mode} la \func{fopen} fallisce.
-
-% Un'altra estensione serve a supportare la localizzazione, quando si
-% aggiunge a \param{mode} una stringa della forma \verb|",ccs=STRING"| il
-% valore \verb|STRING| è considerato il nome di una codifica dei caratteri
-% e \func{fopen} marca il file per l'uso dei caratteri estesi e abilita le
-% opportune funzioni di conversione in lettura e scrittura.
+indicate dopo aver specificato il \param{mode} con uno dei valori della
+seconda sezione di tab.~\ref{tab:file_fopen_mode}. Ad esempio l'uso del
+carattere ``\texttt{e}'' serve ad impostare il \textit{close-on-exec} sul file
+(è analoga all'uso del flag \const{O\_CLOEXEC} in \func{open}), ``\texttt{x}''
+serve per evitare di sovrascrivere un file già esistente (è analoga all'uso
+del flag \const{O\_EXCL} in \func{open}): se il file specificato già esiste e
+si aggiunge questo carattere a \param{mode} la \func{fopen} fallisce.
+
+Altri due valori hanno usi specialistici, con ``\texttt{m}'' si chiede di
+usare il \textit{memory mapping} per l'accesso al file (tratteremo i file
+mappati in memoria in sez.~\ref{sec:file_memory_map}), ma la funzionalità è al
+momento disponibile solo per i file aperti in sola lettura. Con ``\texttt{c}''
+infine si richiede che l'apertura, e le successive operazioni di lettura e
+scrittura, non diventino un \textit{cancellation point} per i \textit{thread}
+(tratteremo l'argomento in sez.~\ref{sec:xxx_thread}).
+
+Un'altra estensione serve a supportare la localizzazione, quando si aggiunge a
+\param{mode} una stringa della forma \verb|",ccs=STRING"| (che deve essere
+sempre in coda a tutte le altre) il valore \verb|STRING| è considerato il nome
+di una codifica dei caratteri e \func{fopen} marca il file per l'uso dei
+caratteri estesi e abilita le opportune funzioni di conversione in lettura e
+scrittura. 
 
 Nel caso si usi \func{fdopen} i valori specificati da \param{mode} devono
 essere compatibili con quelli con cui il file descriptor è stato aperto.
 
 Nel caso si usi \func{fdopen} i valori specificati da \param{mode} devono
 essere compatibili con quelli con cui il file descriptor è stato aperto.
@@ -3837,8 +3854,7 @@ sez.~\ref{sec:proc_conclusion}).
 Una delle caratteristiche più utili dell'interfaccia degli \textit{stream} è
 la ricchezza delle funzioni disponibili per le operazioni di lettura e
 scrittura sui file. Sono infatti previste ben tre diverse modalità di
 Una delle caratteristiche più utili dell'interfaccia degli \textit{stream} è
 la ricchezza delle funzioni disponibili per le operazioni di lettura e
 scrittura sui file. Sono infatti previste ben tre diverse modalità di
-input/output non formattato, che tratteremo in
-sez.~\ref{sec:file_unformatted_io}:
+input/output non formattato:
 \begin{itemize*}
 \item\textsl{Input/Output binario}, una modalità in cui si leggono e scrivono
   blocchi di dati di dimensione arbitraria; è l'analogo della modalità
 \begin{itemize*}
 \item\textsl{Input/Output binario}, una modalità in cui si leggono e scrivono
   blocchi di dati di dimensione arbitraria; è l'analogo della modalità
@@ -3847,17 +3863,17 @@ sez.~\ref{sec:file_unformatted_io}:
 \item\textsl{Input/Output a caratteri}, una modalità in cui si legge e scrive
   un singolo carattere alla volta, anche in questo caso la bufferizzazione
   viene gestita automaticamente dalla libreria;
 \item\textsl{Input/Output a caratteri}, una modalità in cui si legge e scrive
   un singolo carattere alla volta, anche in questo caso la bufferizzazione
   viene gestita automaticamente dalla libreria;
-\item\textsl{input/output di linea}, una modalità in cui si legge e scrive una
+\item\textsl{Input/Output di linea}, una modalità in cui si legge e scrive una
   linea di testo alla volta, in questa modalità si intende per linea una
   sequenza di caratteri terminata dal carattere di \textit{newline}
   (\verb|'\n'|);
 \end{itemize*}
 
   linea di testo alla volta, in questa modalità si intende per linea una
   sequenza di caratteri terminata dal carattere di \textit{newline}
   (\verb|'\n'|);
 \end{itemize*}
 
-A queste tre modalità si aggiunge poi la modalità di input/output formattato,
+A queste tre modalità si aggiunge poi la modalità di input/output formattato
 che tratteremo in sez.~\ref{sec:file_unformatted_io}. Ognuna di queste
 modalità utilizza per l'I/O delle funzioni specifiche che vedremo più avanti,
 affronteremo qui invece gli argomenti e le funzioni che si applicano in
 che tratteremo in sez.~\ref{sec:file_unformatted_io}. Ognuna di queste
 modalità utilizza per l'I/O delle funzioni specifiche che vedremo più avanti,
 affronteremo qui invece gli argomenti e le funzioni che si applicano in
-generale a tutte tutte queste diverse modalità di I/O.
+generale a tutte queste diverse modalità di I/O.
 
 Una prima caratteristica specifica è che differenza di quanto avviene con
 l'interfaccia dei file descriptor, con gli \textit{stream} il raggiungimento
 
 Una prima caratteristica specifica è che differenza di quanto avviene con
 l'interfaccia dei file descriptor, con gli \textit{stream} il raggiungimento
@@ -4039,10 +4055,10 @@ i rispettivi prototipi sono:
 \begin{funcproto}{
 \fhead{stdio.h} 
 \fdecl{size\_t fread(void *ptr, size\_t size, size\_t nmemb, FILE *stream)}
 \begin{funcproto}{
 \fhead{stdio.h} 
 \fdecl{size\_t fread(void *ptr, size\_t size, size\_t nmemb, FILE *stream)}
-\fdesc{Legge i dati da uno \textit{stream}.} 
+\fdesc{Legge i dati da uno \textit{stream} ad un buffer.} 
 \fdecl{size\_t fwrite(const void *ptr, size\_t size, size\_t nmemb, 
   FILE *stream)}
 \fdecl{size\_t fwrite(const void *ptr, size\_t size, size\_t nmemb, 
   FILE *stream)}
-\fdesc{Scrive i dati su uno \textit{stream}.} 
+\fdesc{Scrive i dati da un buffer su uno \textit{stream}.} 
 }
 
 {Le funzioni ritornano il numero di elementi letti o scritti, in caso di
 }
 
 {Le funzioni ritornano il numero di elementi letti o scritti, in caso di
@@ -4104,29 +4120,6 @@ permetta di recuperare l'informazione completa, per assicurarsi che versioni
 diverse del programma siano in grado di rileggere i dati, tenendo conto delle
 eventuali differenze.
 
 diverse del programma siano in grado di rileggere i dati, tenendo conto delle
 eventuali differenze.
 
-La \acr{glibc} definisce infine due ulteriori funzioni per l'I/O binario,
-\funcd{fread\_unlocked} e \funcd{fwrite\_unlocked}, che evitano il lock
-implicito dello \textit{stream} usato per dalla librerie per la gestione delle
-applicazioni \textit{multi-thread} (si veda sez.~\ref{sec:file_stream_thread}
-per i dettagli), i loro prototipi sono:
-
-\begin{funcproto}{
-\fhead{stdio.h}
-\fdecl{size\_t fread\_unlocked(void *ptr, size\_t size, size\_t
-    nmemb, FILE *stream)}
-\fdecl{size\_t fwrite\_unlocked(const void *ptr, size\_t size,
-    size\_t nmemb, FILE *stream)}
-\fdesc{Leggono o scrivono dati su uno \textit{stream} senza acquisire il lock
-  implicito sullo stesso.} 
-}
-
-{Le funzioni ritornano gli stessi valori delle precedenti \func{fread} e
-  \func{fwrite}.}
-\end{funcproto}
-
-% TODO: trattare in generale le varie *_unlocked
-
-
 La seconda modalità di input/output non formattato è quella a caratteri, in
 cui si trasferisce un carattere alla volta.  Le funzioni per la lettura a
 caratteri sono tre, \funcd{fgetc}, \funcd{getc} e \funcd{getchar}, ed i
 La seconda modalità di input/output non formattato è quella a caratteri, in
 cui si trasferisce un carattere alla volta.  Le funzioni per la lettura a
 caratteri sono tre, \funcd{fgetc}, \funcd{getc} e \funcd{getchar}, ed i
@@ -4410,14 +4403,6 @@ quello di \func{fgets} e \func{fputs}, a parte il fatto che tutto (numero di
 caratteri massimo, terminatore della stringa, \textit{newline}) è espresso in
 termini di caratteri estesi anziché di normali caratteri ASCII.
 
 caratteri massimo, terminatore della stringa, \textit{newline}) è espresso in
 termini di caratteri estesi anziché di normali caratteri ASCII.
 
-Come per l'I/O binario e quello a caratteri, anche per l'I/O di linea la
-\acr{glibc} supporta una serie di altre funzioni, estensioni di tutte quelle
-illustrate finora (eccetto \func{gets} e \func{puts}), che eseguono
-esattamente le stesse operazioni delle loro equivalenti, evitando però il lock
-implicito dello \textit{stream} (vedi sez.~\ref{sec:file_stream_thread}). Come
-per le altre forma di I/O, dette funzioni hanno lo stesso nome della loro
-analoga normale, con l'aggiunta dell'estensione \code{\_unlocked}.
-
 Come abbiamo visto, le funzioni di lettura per l'input/output di linea
 previste dallo standard ANSI C presentano svariati inconvenienti. Benché
 \func{fgets} non abbia i gravissimi problemi di \func{gets}, può comunque dare
 Come abbiamo visto, le funzioni di lettura per l'input/output di linea
 previste dallo standard ANSI C presentano svariati inconvenienti. Benché
 \func{fgets} non abbia i gravissimi problemi di \func{gets}, può comunque dare
@@ -4455,10 +4440,10 @@ stringa da leggere.
 
 Essa prende come primo argomento l'indirizzo del puntatore al buffer su cui si
 vuole copiare la linea. Quest'ultimo \emph{deve} essere stato allocato in
 
 Essa prende come primo argomento l'indirizzo del puntatore al buffer su cui si
 vuole copiare la linea. Quest'ultimo \emph{deve} essere stato allocato in
-precedenza con una \func{malloc}, non si può cioè passare come argomento primo
+precedenza con una \func{malloc}: non si può cioè passare come argomento primo
 argomento l'indirizzo di un puntatore ad una variabile locale. Come secondo
 argomento la funzione vuole l'indirizzo della variabile contenente le
 argomento l'indirizzo di un puntatore ad una variabile locale. Come secondo
 argomento la funzione vuole l'indirizzo della variabile contenente le
-dimensioni del buffer suddetto.
+dimensioni del suddetto buffer.
 
 Se il buffer di destinazione è sufficientemente ampio la stringa viene scritta
 subito, altrimenti il buffer viene allargato usando \func{realloc} e la nuova
 
 Se il buffer di destinazione è sufficientemente ampio la stringa viene scritta
 subito, altrimenti il buffer viene allargato usando \func{realloc} e la nuova
@@ -4660,9 +4645,9 @@ specificati in questo ordine:
   \label{tab:file_format_flag}
 \end{table}
 
   \label{tab:file_format_flag}
 \end{table}
 
-Dettagli ulteriori sulle varie opzioni di stampa e su tutte le casistiche
-dettagliate dei vari formati possono essere trovati nella pagina di manuale di
-\func{printf} e nella documentazione della \acr{glibc}.
+Dettagli ulteriori sulle varie opzioni di stampa e su tutte le casistiche dei
+vari formati possono essere trovati nella pagina di manuale di \func{printf} e
+nella documentazione della \acr{glibc}.
 
 \begin{table}[htb]
   \centering
 
 \begin{table}[htb]
   \centering
@@ -4718,13 +4703,13 @@ sez.~\ref{sec:proc_variadic}), sono \funcd{vprintf}, \funcd{vfprintf} e
   valore negativo per un errore.}  
 \end{funcproto}
 
   valore negativo per un errore.}  
 \end{funcproto}
 
-Con queste funzioni diventa possibile selezionare gli argomenti che si
-vogliono passare ad una funzione di stampa, passando direttamente la lista
-tramite l'argomento \param{ap}. Per poter far questo ovviamente la lista
-variabile degli argomenti dovrà essere opportunamente trattata (l'argomento è
-esaminato in sez.~\ref{sec:proc_variadic}), e dopo l'esecuzione della funzione
-l'argomento \param{ap} non sarà più utilizzabile (in generale dovrebbe essere
-eseguito un \code{va\_end(ap)} ma in Linux questo non è necessario).
+Con queste funzioni è possibile selezionare gli argomenti da passare ad una
+funzione di stampa indicando direttamente la lista tramite l'argomento
+\param{ap}. Per poter far questo ovviamente la lista variabile degli argomenti
+dovrà essere trattata come visto in sez.~\ref{sec:proc_variadic}, e dopo
+l'esecuzione della funzione l'argomento \param{ap} non sarà più utilizzabile
+(in generale dovrebbe essere eseguito un \code{va\_end(ap)} ma in Linux questo
+non è necessario).
 
 Come per \func{sprintf} anche per \func{vsprintf} esiste una analoga
 \funcd{vsnprintf} che pone un limite sul numero di caratteri che vengono
 
 Come per \func{sprintf} anche per \func{vsprintf} esiste una analoga
 \funcd{vsnprintf} che pone un limite sul numero di caratteri che vengono
@@ -4798,8 +4783,8 @@ famiglia \func{scanf}; fra queste le tre più importanti sono \funcd{scanf},
 \end{funcproto}
 
 Le funzioni eseguono una scansione della rispettiva fonte di input cercando
 \end{funcproto}
 
 Le funzioni eseguono una scansione della rispettiva fonte di input cercando
-una corrispondenza di quanto letto con il formato dei dati specificato
-da \param{format}, ed effettua le relative conversioni memorizzando il
+una corrispondenza di quanto letto con il formato dei dati specificato da
+\param{format}, ed effettuano le relative conversioni memorizzando il
 risultato negli argomenti seguenti, il cui numero è variabile e dipende dal
 valore di \param{format}. Come per le analoghe funzioni di scrittura esistono
 le relative \funcm{vscanf}, \funcm{vfscanf} e \funcm{vsscanf} che usano un
 risultato negli argomenti seguenti, il cui numero è variabile e dipende dal
 valore di \param{format}. Come per le analoghe funzioni di scrittura esistono
 le relative \funcm{vscanf}, \funcm{vfscanf} e \funcm{vsscanf} che usano un
@@ -5080,12 +5065,6 @@ scelta, si può forzare lo scarico dei dati sul file con la funzione
   \func{write}.}
 \end{funcproto}
 
   \func{write}.}
 \end{funcproto}
 
-\noindent anche di questa funzione esiste una analoga \func{fflush\_unlocked}
-(accessibile definendo una fra \macro{\_BSD\_SOURCE}, \macro{\_SVID\_SOURCE} o
-\macro{\_GNU\_SOURCE}) che non effettua il blocco dello \textit{stream}.
-
-% TODO aggiungere prototipo \func{fflush\_unlocked}?
-
 Se \param{stream} è \val{NULL} lo scarico dei dati è forzato per tutti gli
 \textit{stream} aperti. Esistono però circostanze, ad esempio quando si vuole
 essere sicuri che sia stato eseguito tutto l'output su terminale, in cui serve
 Se \param{stream} è \val{NULL} lo scarico dei dati è forzato per tutti gli
 \textit{stream} aperti. Esistono però circostanze, ad esempio quando si vuole
 essere sicuri che sia stato eseguito tutto l'output su terminale, in cui serve
@@ -5186,15 +5165,14 @@ indolori, e quando il locking dello \textit{stream} non è necessario (come in
 tutti i programmi che non usano i \textit{thread}), tutta la procedura può
 comportare dei costi pesanti in termini di prestazioni. 
 
 tutti i programmi che non usano i \textit{thread}), tutta la procedura può
 comportare dei costi pesanti in termini di prestazioni. 
 
-Per questo motivo abbiamo visto come alle usuali funzioni di I/O non
-formattato siano associate delle versioni \code{\_unlocked} (alcune previste
-dallo stesso standard POSIX, altre aggiunte come estensioni dalla \acr{glibc})
-che possono essere usate quando il locking non serve\footnote{in certi casi
-  dette funzioni possono essere usate, visto che sono molto più efficienti,
-  anche in caso di necessità di locking, una volta che questo sia stato
-  acquisito manualmente.}  con prestazioni molto più elevate, dato che spesso
-queste versioni (come accade per \func{getc} e \func{putc}) sono realizzate
-come macro.
+Per questo motivo alle usuali funzioni di I/O non formattato sono associate
+delle ulteriori versioni, caratterizzate dall'aggiunta del suffisso
+\code{\_unlocked}, che possono essere usate quando il locking non
+serve\footnote{in certi casi dette funzioni possono essere usate, visto che
+  sono molto più efficienti, anche in caso di necessità di locking, una volta
+  che questo sia stato acquisito manualmente.}  con prestazioni molto più
+elevate, dato che spesso queste versioni (come accade per \func{getc} e
+\func{putc}) sono realizzate come macro.
 
 La sostituzione di tutte le funzioni di I/O con le relative versioni
 \code{\_unlocked} in un programma che non usa i \textit{thread} è però un
 
 La sostituzione di tutte le funzioni di I/O con le relative versioni
 \code{\_unlocked} in un programma che non usa i \textit{thread} è però un
@@ -5249,6 +5227,18 @@ con uno dei valori \const{FSETLOCKING\_INTERNAL} o
 
 % TODO trattare \func{clearerr\_unlocked} 
 
 
 % TODO trattare \func{clearerr\_unlocked} 
 
+Per tutte le funzioni che abbiamo trattato in
+sez.~\ref{sec:files_std_interface} che eseguono I/O sugli \textit{stream}
+esiste una versione ``\texttt{\_unlocked}'',\footnote{non ne esistono per
+  funzioni di informazione come \func{ftell} dato che queste non hanno bisogno
+  di un blocco, l'elenco completo delle funzioni ``\texttt{\_unlocked}''
+  comunque è disponibile nella pagina di manuale delle stesse, accessibile con
+  \texttt{man unlocked\_stdio}. } ma nello standard POSIX sono previste solo
+\funcm{getc\_unlocked}, \funcm{getchar\_unlocked}, \funcm{putc\_unlocked} e
+\funcm{putchar\_unlocked}, tutte le altre pur essendo state aggiunte come
+estensioni dalla \acr{glibc}, non sono standard, anche se sono presenti anche
+su altri sistemi unix; in generale comuqnue l'uso di queste funzioni è
+sconsigliato e non le tratteremo esplicitamente.
 
 
 %%% Local Variables: 
 
 
 %%% Local Variables: 
@@ -5310,13 +5300,14 @@ con uno dei valori \const{FSETLOCKING\_INTERNAL} o
 % LocalWords:  wrapper EMPTY olddirfd oldpath newdirfd newpath capability ino
 % LocalWords:  SEARCH flink choot oldirfd NOREPLACE EXCHANGE WHITEOUT union
 % LocalWords:  renamat syscall whiteout overlay filesytem Live nell' sull'
 % LocalWords:  wrapper EMPTY olddirfd oldpath newdirfd newpath capability ino
 % LocalWords:  SEARCH flink choot oldirfd NOREPLACE EXCHANGE WHITEOUT union
 % LocalWords:  renamat syscall whiteout overlay filesytem Live nell' sull'
-% LocalWords:  statbuf statxbuf IFMT nlink atime mtime fexecve argv envp
-% LocalWords:  blocks STATS btime RESERVED ctime ATTR dev ENOSYS
-% LocalWords:  timestamp attributes COMPRESSED immutable NODUMP
-% LocalWords:  dump ENCRYPTED rdev all'I dell'I
+% LocalWords:  statbuf statxbuf IFMT nlink atime mtime fexecve argv envp GET
+% LocalWords:  blocks STATS btime RESERVED ctime ATTR dev ENOSYS locks SEALS
+% LocalWords:  timestamp attributes COMPRESSED immutable NODUMP HINT hints
+% LocalWords:  dump ENCRYPTED rdev all'I dell'I uint cancellation mmap
 
 %%% Local Variables: 
 %%% mode: latex
 %%% TeX-master: "gapil"
 %%% End: 
 
 
 %%% Local Variables: 
 %%% mode: latex
 %%% TeX-master: "gapil"
 %%% End: 
 
+%  LocalWords:  mapping