Uniformato "user space" in italic e corrette alcune parti degli
[gapil.git] / fileio.tex
index 80b5c5430aa1f1fdd0031ce03ec429a8fe1c868f..0a66a9ba195298aba135f7e42a920ffe85d70c6c 100644 (file)
@@ -206,9 +206,9 @@ Si ritrova quindi anche con le voci della \textit{file table} una situazione
 analoga di quella delle voci di una directory, con la possibilità di avere più
 voci che fanno riferimento allo stesso \textit{inode}. L'analogia è in realtà
 molto stretta perché quando si cancella un file, il kernel verifica anche che
 analoga di quella delle voci di una directory, con la possibilità di avere più
 voci che fanno riferimento allo stesso \textit{inode}. L'analogia è in realtà
 molto stretta perché quando si cancella un file, il kernel verifica anche che
-non resti nessun riferimento in una una qualunque voce della \textit{file
-  table} prima di liberare le risorse ad esso associate e disallocare il
-relativo \textit{inode}.
+non resti nessun riferimento in una qualunque voce della \textit{file table}
+prima di liberare le risorse ad esso associate e disallocare il relativo
+\textit{inode}.
 
 Nelle vecchie versioni di Unix (ed anche in Linux fino al kernel 2.0.x) il
 numero di file aperti era anche soggetto ad un limite massimo dato dalle
 
 Nelle vecchie versioni di Unix (ed anche in Linux fino al kernel 2.0.x) il
 numero di file aperti era anche soggetto ad un limite massimo dato dalle
@@ -590,7 +590,7 @@ di essi possono anche essere modificati tramite questa funzione, con
 conseguente effetto sulle caratteristiche operative che controllano (torneremo
 sull'argomento in sez.~\ref{sec:file_fcntl_ioctl}).
 
 conseguente effetto sulle caratteristiche operative che controllano (torneremo
 sull'argomento in sez.~\ref{sec:file_fcntl_ioctl}).
 
-Il flag \const{O\_ASYNC} (che, per per compatibilità con BSD, si può indicare
+Il flag \const{O\_ASYNC} (che, per compatibilità con BSD, si può indicare
 anche con la costante \constd{FASYNC}) è definito come possibile valore per
 \func{open}, ma per un bug dell'implementazione,\footnote{segnalato come
   ancora presente nella pagina di manuale almeno fino al Settembre 2011.} non
 anche con la costante \constd{FASYNC}) è definito come possibile valore per
 \func{open}, ma per un bug dell'implementazione,\footnote{segnalato come
   ancora presente nella pagina di manuale almeno fino al Settembre 2011.} non
@@ -886,8 +886,8 @@ Questo comporta che in generale, fintanto che lo si è scritto sequenzialmente,
 la dimensione di un file sarà più o meno corrispondente alla quantità di
 spazio disco da esso occupato, ma esistono dei casi, come questo in cui ci si
 sposta in una posizione oltre la fine corrente del file, o come quello
 la dimensione di un file sarà più o meno corrispondente alla quantità di
 spazio disco da esso occupato, ma esistono dei casi, come questo in cui ci si
 sposta in una posizione oltre la fine corrente del file, o come quello
-accennato in in sez.~\ref{sec:file_file_size} in cui si estende la dimensione
-di un file con una \func{truncate}, in cui in sostanza si modifica il valore
+accennato in sez.~\ref{sec:file_file_size} in cui si estende la dimensione di
+un file con una \func{truncate}, in cui in sostanza si modifica il valore
 della dimensione di \var{st\_size} senza allocare spazio su disco. Questo
 consente di creare inizialmente file di dimensioni anche molto grandi, senza
 dover occupare da subito dello spazio disco che in realtà sarebbe
 della dimensione di \var{st\_size} senza allocare spazio su disco. Questo
 consente di creare inizialmente file di dimensioni anche molto grandi, senza
 dover occupare da subito dello spazio disco che in realtà sarebbe
@@ -1694,6 +1694,13 @@ tab.~\ref{tab:file_atfunc_corr}, oltre al nuovo argomento iniziale, è prevista
 anche l'aggiunta di un ulteriore argomento finale, \param{flags}.
 
 
 anche l'aggiunta di un ulteriore argomento finale, \param{flags}.
 
 
+
+
+% TODO trattare fstatat e con essa
+% TODO trattare anche statx, aggiunta con il kernel 4.11 (vedi
+% https://lwn.net/Articles/707602/ e
+% https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=a528d35e8bfcc521d7cb70aaf03e1bd296c8493f) 
+
 % TODO manca prototipo di linkat, verificare se metterlo o metter menzione
 % altre modifiche al riguardo nel 3.11 (AT_EMPTY_PATH?) vedi
 % http://lwn.net/Articles/562488/ 
 % TODO manca prototipo di linkat, verificare se metterlo o metter menzione
 % altre modifiche al riguardo nel 3.11 (AT_EMPTY_PATH?) vedi
 % http://lwn.net/Articles/562488/ 
@@ -1856,15 +1863,88 @@ costanti utilizzabili per i valori di \param{flags}.
 \end{table}
 
 
 \end{table}
 
 
+\texttt{ATTENZIONE PARTE DA RIVEDERE}
+
+
 Un'ultima differenza fra le \textit{at-functions} e le funzioni tradizionali
 di cui sono estensione è, come accennato in sez.~\ref{sec:file_temp_file},
 quella relativa a \func{utimensat} che non è propriamente una corrispondente
 esatta di \func{utimes} e \func{lutimes}, dato che questa funzione ha una
 maggiore precisione nella indicazione dei tempi dei file, per i quali come per
 \func{futimes}, si devono usare strutture \struct{timespec} che consentono una
 Un'ultima differenza fra le \textit{at-functions} e le funzioni tradizionali
 di cui sono estensione è, come accennato in sez.~\ref{sec:file_temp_file},
 quella relativa a \func{utimensat} che non è propriamente una corrispondente
 esatta di \func{utimes} e \func{lutimes}, dato che questa funzione ha una
 maggiore precisione nella indicazione dei tempi dei file, per i quali come per
 \func{futimes}, si devono usare strutture \struct{timespec} che consentono una
-precisione fino al nanosecondo.
+precisione fino al nanosecondo; la funzione è stata introdotta con il kernel
+2.6.22,\footnote{in precedenza, a partire dal kernel 2.6.16, era stata
+  introdotta una \textit{system call} \funcm{futimesat} seguendo una bozza
+  della revisione dello standard poi modificata; questa funzione, sostituita
+  da \func{utimensat}, è stata dichiarata obsoleta, non è supportata da
+  nessuno standard e non deve essere più utilizzata: pertanto non ne
+  parleremo.} ed il suo prototipo è:
+
+\begin{funcproto}{
+\fhead{sys/time.h}
+\fdecl{int utimensat(int dirfd, const char *pathname, const struct
+    timespec times[2], int flags)}
+\fdesc{Cambia i tempi di un file.} 
+}
+
+{La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual
+  caso \var{errno} assumerà uno dei valori: 
+  \begin{errlist}
+  \item[\errcode{EACCES}] si è richiesta l'impostazione del tempo corrente ma
+    non si ha il permesso di scrittura sul file, o non si è proprietari del
+    file o non si hanno i privilegi di amministratore; oppure il file è
+    immutabile (vedi sez.~\ref{sec:file_perm_overview}).
+  \item[\errcode{EBADF}] \param{dirfd} non è \const{AT\_FDCWD} o un file
+    descriptor valido.
+  \item[\errcode{EFAULT}] \param{times} non è un puntatore valido oppure
+    \param{dirfd} è \const{AT\_FDCWD} ma \param{pathname} è \var{NULL} o non è
+    un puntatore valido.
+  \item[\errcode{EINVAL}] si sono usati dei valori non corretti per i tempi di
+    \param{times}, oppure è si usato un valore non valido per \param{flags},
+    oppure \param{pathname} è \var{NULL}, \param{dirfd} non è
+    \const{AT\_FDCWD} e \param{flags} contiene \const{AT\_SYMLINK\_NOFOLLOW}.
+  \item[\errcode{EPERM}] si è richiesto un cambiamento nei tempi non al tempo
+    corrente, ma non si è proprietari del file o non si hanno i privilegi di
+    amministratore; oppure il file è immutabile o \textit{append-only} (vedi
+    sez.~\ref{sec:file_perm_overview}).
+  \item[\errcode{ESRCH}] non c'è il permesso di attraversamento per una delle
+    componenti di \param{pathname}.
+  \end{errlist}
+  ed inoltre per entrambe \errval{EROFS} e per \func{utimensat}
+  \errval{ELOOP}, \errval{ENAMETOOLONG}, \errval{ENOENT}, \errval{ENOTDIR} nel
+  loro significato generico.}
+\end{funcproto}
+
+La funzione imposta i tempi dei file utilizzando i valori passati nel vettore
+di strutture \struct{timespec} esattamente come \func{futimes} (si veda quanto
+illustrato in sez.~\ref{sec:file_file_times}). 
+
+La funzione supporta invece, rispetto ad \func{utimes} che abbiamo visto in
+sez.~\ref{sec:file_file_times}, una sintassi più complessa che consente una
+indicazione sicura del file su cui operare specificando la directory su cui si
+trova tramite il file descriptor \param{dirfd} ed il suo nome come
+\textit{pathname relativo} in \param{pathname}.\footnote{su Linux solo
+  \func{utimensat} è una \textit{system call} e \func{futimens} è una funzione
+  di libreria, infatti se \param{pathname} è \var{NULL} \param{dirfd} viene
+  considerato un file descriptor ordinario e il cambiamento del tempo
+  applicato al file sottostante, qualunque esso sia, per cui
+  \code{futimens(fd, times}) è del tutto equivalente a \code{utimensat(fd,
+    NULL, times, 0)} ma nella \acr{glibc} questo comportamento è disabilitato
+  seguendo lo standard POSIX, e la funzione ritorna un errore di
+  \errval{EINVAL} se invocata in questo modo.}
+
+Torneremo su questa sintassi e sulla sua motivazione in
+sez.~\ref{sec:file_openat}, quando tratteremo tutte le altre funzioni (le
+cosiddette \textit{at-functions}) che la utilizzano; essa prevede comunque
+anche la presenza dell'argomento \param{flags} con cui attivare flag di
+controllo che modificano il comportamento della funzione, nel caso specifico
+l'unico valore consentito è \const{AT\_SYMLINK\_NOFOLLOW} che indica alla
+funzione di non dereferenziare i collegamenti simbolici, cosa che le permette
+di riprodurre le funzionalità di \func{lutimes}.
+
+
+\texttt{ATTENZIONE PARTE DA RIVEDERE}
 
 
-% NOTA: manca prototipo di utimensat, per ora si lascia una menzione
 
 \itindend{at-functions}
 
 
 \itindend{at-functions}
 
@@ -2215,7 +2295,7 @@ il nome indicato nel precedente prototipo), è riportata di seguito:
   modifica è opportuno rileggere la nuova dimensione con
   \const{F\_GETPIPE\_SZ}. I processi non privilegiati\footnote{per la
     precisione occorre la capacità \const{CAP\_SYS\_RESOURCE}.} non possono
   modifica è opportuno rileggere la nuova dimensione con
   \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
+  impostare un valore superiore a quello indicato da
   \sysctlfiled{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}.
   \sysctlfiled{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}.
@@ -2783,7 +2863,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
 
 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à modalità di
+scrittura sui file. Sono infatti previste ben tre diverse modalità di
 input/output non formattato:
 \begin{itemize}
 \item\textsl{binario} in cui si leggono e scrivono blocchi di dati di
 input/output non formattato:
 \begin{itemize}
 \item\textsl{binario} in cui si leggono e scrivono blocchi di dati di