-%% 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
automatica della posizione sul file fra padre e figlio che occorre tenere
presente.
+\itindbeg{close-on-exec}
+
Si noti inoltre che in questo caso anche i flag di stato del file, essendo
mantenuti nella struttura \kstruct{file} della \textit{file table}, vengono
condivisi, per cui una modifica degli stessi con \func{fcntl} (vedi
sez.~\ref{sec:file_fcntl_ioctl}) si applicherebbe a tutti processi che
condividono la voce nella \textit{file table}. Ai file però sono associati
-anche altri flag, dei quali l'unico usato al momento è \constd{FD\_CLOEXEC},
-detti \itindex{file~descriptor~flags} \textit{file descriptor flags}; questi
-invece sono mantenuti in \kstruct{file\_struct}, e perciò sono locali per
-ciascun processo e non vengono modificati dalle azioni degli altri anche in
-caso di condivisione della stessa voce della \textit{file table}.
+anche altri flag detti \itindex{file~descriptor~flags} \textit{file descriptor
+ flags}. Questi invece sono mantenuti in \kstruct{file\_struct}, e perciò
+sono locali per ciascun processo e non vengono modificati dalle azioni degli
+altri anche in caso di condivisione della stessa voce della \textit{file
+ table}; l'unico usato al momento è quello di \textit{close-on-exec} che
+indica che il file descriptor deve essere chiuso in una \func{exec} (vedi
+sez.~\ref{sec:proc_exec}).
+
+\itindend{close-on-exec}
Si tenga presente dunque che in un sistema unix-like è sempre possibile per
più processi accedere in contemporanea allo stesso file e che non esistono, a
suo \textit{file descriptor flag} indipendente. A questo proposito deve essere
tenuto presente che nel caso in cui si usi \func{dup} per duplicare un file
descriptor, se questo ha il flag di \textit{close-on-exec} attivo (vedi
-sez.~\ref{sec:proc_exec} e sez.~\ref{sec:file_fcntl_ioctl}), questo verrà
+sez.~\ref{sec:proc_exec} e sez.~\ref{sec:file_shared_access}), questo verrà
cancellato nel file descriptor restituito come copia.
L'uso principale di questa funzione è nella shell per la redirezione dei file
Essendo accomunate dalla stessa interfaccia le tratteremo insieme in questa
sezione pur non essendo strettamente attinenti l'I/O su file.
-
Benché queste funzioni non siano presenti negli standard tradizionali esse
sono state adottate da altri sistemi unix-like come Solaris, i vari BSD, fino
ad essere incluse in una recente revisione dello standard POSIX.1 (la
\label{tab:at-functions_constant_values}
\end{table}
-\footnotetext{si tratta di una funzionalità fornita dal kernel che consente di
- montare automaticamente una directory quando si accede ad un
- \textit{pathname} al di sotto di essa, per i dettagli, più di natura
- sistemistica, si può consultare sez.~5.1.6 di \cite{AGL}.}
+\footnotetext{l'\textit{automount} \itindex{automount} è una funzionalità
+ fornita dal kernel che consente di montare automaticamente una directory
+ quando si accede ad un \textit{pathname} al di sotto di essa, per i
+ dettagli, di natura prevalentemente sistemistica, si può consultare
+ sez.~5.1.6 di \cite{AGL}.}
Si tenga presente che non tutte le funzioni che prevedono l'argomento
aggiuntivo sono \textit{system call}, ad esempio \func{faccessat} e
\fhead{sys/stat.h}
\fdecl{int fstatat(int dirfd, const char *pathname, struct stat *statbuf, int
flags)}
-\fdesc{Rimuove una voce da una directory.}
+\fdesc{Legge le informazioni di un file.}
}
{La funzione ritorna gli stessi valori e gli stessi codici di errore di
sez.~\ref{sec:file_chroot}) un qualunque file sia stato aperto fuori dallo
stesso prima di entrarvi.
-
% NOTE per la discussione sui problemi di sicurezza relativi a questa
% funzionalità vedi http://lwn.net/Articles/562488/
amministrativi, anche se, quando è disponibile il filesystem \texttt{/proc}, è
possibile usare \func{linkat} per creare un file da un qualunque file
descriptor un processo abbia aperto, usandola con un codice analogo al
-seguente:\footnote{non esiste, al momento, una modalità per evitare i rischi
- illustrati in precedenza se si sta usando il filesystem \textit{proc}.}
+seguente:\footnote{non esiste al momento, se si sta usando il filesystem
+ \textit{proc}, una modalità per evitare i rischi illustrati in precedenza.}
\includecodesnip{listati/procfd_linkat.c}
-
-Questa modalità è anche quella con cui è possibile assegnare in un secondo
+e questa modalità è anche quella con cui è possibile assegnare in un secondo
tempo il nome ad un file anonimo creato usando \func{open} con
\const{O\_TMPFILE}; ma si deve tenere presente che per questi file la funzione
-ha un comportamento particolare. In generale infatti quando il file sorgente
-di \func{linkat} ha un numero di collegamenti nulli (cosa che avviene ad
-esempio quando si apre un file temporaneo e lo si cancella subito dopo oppure
-quando viene cancellato un file aperto in precedenza) la funzione non consente
-di ricollegarlo ad un altro file riassegnandogli un nuovo nome e fallisce
-sempre, qualunque siano i permessi del processo e che si usi questo approccio
-o \const{AT\_EMPTY\_PATH}, con un errore di \errval{ENOENT}.
-
-Questo non avviene se il file descriptor sorgente è stato ottenuto con
-\const{O\_TMPFILE} e la funzione ha successo, a meno che non si sia usato
-nell'apertura anche \const{O\_EXCL} per impedire questo specifico
-comportamento, e continuare ad ottenere l'errore di \errval{ENOENT}. In fig.
-
-Pertanto la modalità per creare in maniera sicura la versione iniziale di un
-file cui abbiamo accennato a pag.~\pageref{open_o_tmpfile_flag},
-
+ha un comportamento particolare.
+
+In generale infatti quando il file sorgente di \func{linkat} ha un numero di
+collegamenti nulli (cosa che avviene ad esempio quando si apre un file
+temporaneo e lo si cancella subito dopo oppure quando viene cancellato un file
+aperto in precedenza) la funzione non consente di ricollegarlo ad un altro
+file riassegnandogli un nuovo nome e fallisce sempre con un errore di
+\errval{ENOENT} qualunque siano i permessi del processo, e che si usi questo
+approccio o \const{AT\_EMPTY\_PATH}. Ma questo non avviene se il file
+descriptor è stato ottenuto con \const{O\_TMPFILE}, in tal caso la funzione ha
+successo, a meno che non si sia usato nell'apertura anche \const{O\_EXCL} per
+impedire questo comportamento, e continuare ad ottenere \errval{ENOENT}.
+
+In fig.~\ref{fig:initfile} si è riportato il codice della funzione
+\func{InitFile}, che consente di creare in maniera sicura il contenuto
+iniziale di un file utilizzando \const{O\_TMPFILE} e \func{linkat}, come
+accennato a pag.~\pageref{open_o_tmpfile_flag}. La funzione richiede di
+indicare il file da creare usando la sintassi delle \textit{at-functions},
+specificando la directory in cui crearlo con il corrispondente file descriptor
+passato nell'argomento \texttt{dirfd} ed il pathname relativo ed essa passato
+l'argomento \texttt{file}; il contenuto iniziale del file deve essere fornito
+nel buffer \texttt{buf} di lunghezza \texttt{size}.
+
\begin{figure}[!htb]
\footnotesize \centering
\begin{minipage}[c]{\codesamplewidth}
- \includecodesample{listati/initfile.c}
+ \includecodesample{listati/InitFile.c}
\end{minipage}
- \caption{Esempio di codice creare in maniera sicura il contenuto iniziale di
- un file.}
+ \caption{Esempio di codice per creare in maniera sicura il contenuto
+ iniziale di un file.}
\label{fig:initfile}
\end{figure}
-
-
-
-
-
-% TODO: Trattare esempio di inzializzazione di file e successivo collegamento
-% con l'uso di O_TMPFILE e linkat, vedi man open
-
-
-
-% TODO manca prototipo di renameat2, introdotta nel 3.15, vedi
-% http://lwn.net/Articles/569134/
-
+La funzione come primo passo (\texttt{\small 6--10}) ottiene un file
+descriptor accessibile in lettura/scrittura invocando \func{openat} con il
+flag \const{O\_TMPFILE} per ottenere un file anonimo, facendo riferimento a
+quella che sarà la directory di destinazione in cui poi verrà collegato lo
+stesso passata dal chiamante in \texttt{dirfd}, usando ``\texttt{.}'' come
+\textit{pathname} relativo. Si noti come nella chiamata si impostino anche
+(per semplicità si è usato un valore fisso) i valori iniziali dei permessi del
+file (lettura e scrittura solo per il proprietario), e come dopo la chiamata
+si controlli la presenza di un eventuale errore, ritornandolo con un messaggio
+qualora avvenga.
+
+Il secondo passo (\texttt{\small 11--15}) è quello di chiamare la funzione
+\func{FullWrite} (che tratteremo in dettaglio in sez.~\ref{sec:sock_io_behav})
+per eseguire la scrittura del contenuto del buffer \texttt{buf} sul file
+anonimo ottenuto con \func{openat}; in sostanza la funzione scrive tutto il
+contenuto del buffer, iterando le scritture qualora non sia possibile eseguire
+tutto con una singola \func{write}, cosa che comunque per i file su disco in
+genere non avviene mai.
+
+Una volta completata con successo la scrittura l'ultimo passo (\texttt{\small
+ 17--23}) è collegare il file anonimo con \func{linkat}, per questo però
+occorre utilizzare il \textit{pathname} ad esso associato sotto
+\texttt{/proc}, che viene ottenuto (\texttt{\small 16}) con una
+\func{snprintf} (vedi sez.~\ref{sec:file_formatted_io}) usando file descriptor
+restituito da \func{openat}. Con questo \textit{pathname} si può procedere
+(\texttt{\small 17}) a chiamare \func{linkat} per eseguire il collegamento, in
+cui occorre usare il flag \const{AT\_SYMLINK\_NOFOLLOW} come nell'esempio
+precedente.
Altre due funzioni che utilizzano due \textit{pathname} (e due file
descriptor) sono \funcd{renameat} e \funcd{renameat2}, corrispondenti alla
equivalente all'utilizzo di \func{renamat2} con un valore nullo per
\param{flags}.
-L'uso di \func{renameat} è identico a quello di \func{rename}, con le solite
-note relative alle estensioni delle \textit{at-functions}, applicate ad
-entrambi i \textit{pathname} passati come argomenti alla funzione. Con
-\func{renameat2} l'introduzione dell'argomento \func{flags} (i cui valori
-possibili sono riportati in tab.~\ref{tab:renameat2_flag_values}) ha permesso
-di aggiungere alcune funzionalità non previste al momento da nessuno standard,
-e specifiche di Linux. Si tenga conto che questa funzione di sistema non viene
-definita nella \acr{glibc} per cui deve essere chiamata utilizzando
-\func{syscall} come illustrato in sez.~\ref{sec:intro_syscall}.
+L'uso di \func{renameat} è identico a quello di \func{rename}, con la sintassi
+delle \textit{at-functions} applicabile ad entrambi i \textit{pathname} passati
+come argomenti alla funzione. Con \func{renameat2} l'introduzione
+dell'argomento \func{flags} (i cui valori possibili sono riportati in
+tab.~\ref{tab:renameat2_flag_values}) ha permesso di aggiungere alcune
+funzionalità specifiche di Linux non previste al momento da nessuno standard
+(la funzione è disponibile nelle \acr{glibc} a partire dalla versione 2.28).
\begin{table}[htb]
\centering
funzionalità relative alla \textit{at-functions}, ma consente di estendere le
funzionalità di \func{rename}. In particolare \func{renameat2} consente di
eseguire uno scambio di nomi in maniera atomica usando il flag
-\constd{RENAME\_EXCHANGE}; quando viene specificato la funzione non solo
-rinomina \param{oldpath} in \param{newpath}, ma rinomina anche, senza dover
-effettuare un passaggio intermedio, \param{newpath} in \param{oldpath}. Quando
-si usa questo flag, entrambi i \textit{pathname} passati come argomenti alla
-funzione devono esistere, e non è possibile usare \const{RENAME\_NOREPLACE},
-non ci sono infine restrizioni sul tipo dei file (regolari, directory, link
-simbolici, ecc.) di cui si scambia il nome.
+\constd{RENAME\_EXCHANGE}; se specificato la funzione rinomina in un colpo
+solo \param{oldpath} in \param{newpath} e \param{newpath} in
+\param{oldpath}. Usando questo flag, entrambi i \textit{pathname} passati come
+argomenti devono esistere, e non è possibile usare \const{RENAME\_NOREPLACE},
+non ci sono infine restrizioni sul tipo di file (regolare, directory, link
+simbolici, dispositivo) di cui si scambia il nome.
Il flag \constd{RENAME\_NOREPLACE} consente di richiedere la generazione di un
errore nei casi in cui \func{rename} avrebbe causato una sovrascrittura della
richiede un approfondimento specifico, in quanto attiene all'uso della
funzione con dei filesystem di tipo \textit{overlay}/\textit{union}, dato che
il flag ha senso solo quando applicato a file che stanno su questo tipo di
-filesystem.
-
-Un \textit{overlay} o \texttt{union filesystem} è un filesystem speciale
-strutturato in livelli, in cui si rende scrivibile un filesystem accessibile
-in sola lettura, \textsl{sovrapponendogli} un filesystem scrivibile su cui
-vanno tutte le modifiche. Un tale tipo di filesystem serve ad esempio a
-rendere scrivibili i dati processati quando si fa partire una distribuzione
-\textit{Live} basata su CD o DVD, ad esempio usando una chiavetta o uno spazio
-disco aggiuntivo.
+filesystem. Un \textit{overlay} o \textit{union filesystem} è un filesystem
+speciale strutturato in livelli, in cui si rende scrivibile un filesystem
+accessibile in sola lettura, \textsl{sovrapponendogli} un filesystem
+scrivibile su cui vanno tutte le modifiche. Un tale tipo di filesystem serve
+ad esempio a rendere scrivibili i dati processati quando si fa partire una
+distribuzione \textit{Live} basata su CD o DVD, ad esempio usando una
+chiavetta o uno spazio disco aggiuntivo.
In questo caso quando si rinomina un file che sta nello strato in sola lettura
-quello che succede è questo viene copiato a destinazione sulla parte
-accessibile in scrittura, ma l'originale non può essere cancellato, per far si
-che esso non appaia più è possibile creare
+questo viene copiato a destinazione sulla parte accessibile in scrittura, ma
+l'originale non può essere cancellato; per far si che esso non appaia più è
+possibile creare un oggetto speciale del filesystem, chiamato
+\textit{whiteout}, che serve a renderlo non più visibile. La funzione consente
+di creare questo oggetto, che in un filesystem ordinario verrebbe visto come
+un file di dispositivo con \textit{major minor} e \textit{minor number} nulli,
+in maniera atomica quando si rinomina un file. Dato che l'uso di
+\const{RENAME\_WHITEOUT} comporta in sostanza la creazione di un file di
+dispositivo, l'operazione è privilegiata (occorre la \textit{capability}
+\const{CAP\_MKNOD}), inoltre occorre anche il supporto nel filesystem usato
+come supporto per la scrittura. Infine l'operazione non è compatibile con
+\const{RENAME\_EXCHANGE}.
\itindend{overlay~filesytem}
\itindend{union~filesytem}
+Benché non rientri nelle \textit{at-functions} previste nello standard
+POSIX.1-2008, tratteremo qui anche la funzione di sistema \funcd{statx},
+introdotta con il kernel 4.11 e disponibile dalle versione 2.28 della
+\acr{glibc}, il cui prototipo è:
+
+\begin{funcproto}{
+\fhead{sys/types.h}
+\fhead{sys/stat.h}
+\fhead{unistd.h}
+\fhead{fcntl.h}
+\fdecl{int statx(int dirfd, const char *pathname, int flags, \\
+\phantom{int statx(}unsigned int mask, struct statx *statxbuf)}
+\fdesc{Legge le informazioni di un file.}
+}
+
+{La funzione ritorna gli stessi valori e gli stessi codici di errore di
+ \func{stat}, \func{fstat}, o \func{lstat} a seconda del valore di
+ \param{flags}, ed in più:
+ \begin{errlist}
+ \item[\errcode{EBADF}] \param{dirfd} non è un file descriptor valido.
+ \item[\errcode{EINVAL}] \param{flags} non ha un valore valido o \param{mask}
+ ha un valore riservato.
+ \item[\errcode{ENOTDIR}] \param{pathname} è un \textit{pathname} relativo,
+ ma \param{dirfd} fa riferimento ad un file.
+ \end{errlist}
+}
+\end{funcproto}
+
+La funzione è una estensione specifica di Linux consente di leggere le
+informazioni di un file; ha la stessa sintassi di \func{fstatat} utilizzando
+con lo stesso significato gli argomenti \param{dirfd} e \param{pathname} ed i
+valori \const{AT\_EMPTY\_PATH}, \const{AT\_NO\_AUTOMOUNT} e
+\const{AT\_SYMLINK\_NOFOLLOW} per \param{flags}. Si può pertanto indicare il
+file di cui si vogliono ottenere i dati con un \textit{pathname} assoluto, con
+un \textit{pathname} relativo (sia alla directory corrente che a quella
+indicata da \param{dirfd}) o con un file descriptor ad esso associato.
+
+La funzione però consente di ottenere informazioni più dettagliate rispetto a
+quelle fornite dalle funzioni tradizionali come \func{stat} e \func{fstatat},
+ed è in grado di controllare le modalità con cui le ottiene nel caso un file
+sia posto su un filesystem remoto. Per questo, oltre ai tre valori
+precedenti, l'argomento \param{flags} consente anche gli ulteriori valori
+elencati in tab.~\ref{tab:statx_flags_const}, con il significato ivi
+illustrato.
+
+\begin{table}[htb]
+ \centering
+ \footnotesize
+ \begin{tabular}[c]{|l|p{8cm}|}
+ \hline
+ \textbf{Costante} & \textbf{Significato} \\
+ \hline
+ \hline
+ \constd{AT\_STATX\_SYNC\_AS\_STAT}& si comporta esattamente come
+ \func{stat}, in questo caso (il default
+ se non viene indicato niente) il
+ risultato dipende dal tipo di
+ filesystem.\\
+ \constd{AT\_STATX\_FORCE\_SYNC}& richiede che i valori degli attributi
+ richiesti siano, in caso di un filesystem
+ di rete, siano sincronizzati con il server
+ remoto, questo può forzare una scrittura
+ dei dati (in particolare i tempi del file)
+ verso lo stesso.\\
+ \constd{AT\_STATX\_DONT\_SYNC} & chiede di non sincronizzare nessun dato,
+ ritornando quanto presente nella cache,
+ questo significa che i dati potrebbero
+ essere non coerenti ed aggiornati, ma si
+ evita, in caso di filesystem di rete, la
+ necessità di contattare il server remoto.\\
+ \hline
+ \end{tabular}
+ \caption{Valori specifici di \func{statx} per l'argomento \param{flags}.}
+ \label{tab:statx_flags_const}
+\end{table}
+
+La funzione restituisce le informazioni relative al file richiesto nella
+struttura \struct{statx} puntata dall'argomento \param{statxbuf}. Inoltre
+data la quantità di informazioni che possono essere richieste, la funzione
+consente, con l'argomento \param{mask} di selezionare quelle volute, questa
+deve essere assegnata ad una maschera binaria dei valori illustrati in
+tab.~\ref{tab:statx_mask_const}.
+
+\begin{table}[htb]
+ \centering
+ \footnotesize
+ \begin{tabular}[c]{|l|l|}
+ \hline
+ \textbf{Costante} & \textbf{Significato} \\
+ \hline
+ \hline
+ \constd{STATX\_TYPE} & Tipo del file (\texttt{stx\_mode \& S\_IFMT}).\\
+ \constd{STATX\_MODE} & Permessi del file (\texttt{stx\_mode \&
+ \tild{}S\_IFMT}).\\
+ \constd{STATX\_NLINK} & Numero di collegamenti (\textit{hard link},
+ \texttt{stx\_nlink}).\\
+ \constd{STATX\_UID} & Proprietario del file (per \ids{UID},
+ \texttt{stx\_uid}).\\
+ \constd{STATX\_GID} & Gruppo proprietario del file (per \ids{GID},
+ \texttt{stx\_gid}).\\
+ \constd{STATX\_ATIME} & Tempo di ultimo accesso (\texttt{stx\_atime}).\\
+ \constd{STATX\_MTIME} & Tempo di ultima modifica (\texttt{stx\_mtime}).\\
+ \constd{STATX\_CTIME} & Tempo di ultimo cambiamento (\texttt{stx\_ctime}).\\
+ \constd{STATX\_INO} & Numero di \textit{inode} (\texttt{stx\_ino}).\\
+ \constd{STATX\_SIZE} & Dimensione del file (\texttt{stx\_size}).\\
+ \constd{STATX\_BLOCKS}& Numero di blocchi del file (\texttt{stx\_blocks}).\\
+ \constd{STATX\_BASIC\_STATS}& Tutte le informazioni precedenti.\\
+ \constd{STATX\_BTIME} & Tempo di creazione (\texttt{stx\_btime}).\\
+% \constd{}& .\\
+ \constd{STATX\_ALL} & Tutte le informazioni.\\
+ \hline
+ \end{tabular}
+ \caption{Le costanti per i valori dell'argomento \param{mask} di
+ \func{statx}.}
+ \label{tab:statx_mask_const}
+\end{table}
+
+Si tenga presente che il kernel non richiede che \param{mask} contenga solo i
+flag di tab.~\ref{tab:statx_mask_const}, valori ulteriori in genere vengono
+ignorati ma non si può comunque indicare un valore qualunque in quanto alcuni
+bit sono riservati per future estensioni.\footnote{in particolare il bit
+ \constd{STATX\_\_RESERVED} che se usato causa il fallimento della funzione
+ con un errore di \errval{EINVAL}.} Inoltre non è detto che tutte le
+informazioni richieste con \param{mask} siano disponibili, per questo il
+kernel restituisce in un opportuno campo della struttura \struct{statx},
+\var{stx\_mask}, quali sono i dati effettivamente restituiti, che possono in
+alcuni casi essere anche di più di quelli richiesti (se l'informazione
+aggiuntiva è ottenuta senza costi ulteriori) per cui è normale che questo
+valore possa essere diverso da quanto richiesto.
+
+\begin{figure}[!htb]
+ \footnotesize
+ \centering
+ \begin{minipage}[c]{0.8\textwidth}
+ \includestruct{listati/statx.h}
+ \end{minipage}
+ \normalsize
+ \caption{La struttura \structd{statx} per la lettura delle informazioni dei
+ file.}
+ \label{fig:file_statx_struct}
+\end{figure}
+
+Si è riportata in fig.~\ref{fig:file_statx_struct} la definizione della
+struttura \struct{statx} come presente in \headfile{sys/stat.h}; i campi
+\var{stx\_mode}, \var{stx\_nlink}, \var{stx\_uid}, \var{stx\_gid},
+\var{stx\_ino}, \var{stx\_size}, \var{stx\_blksize}, \var{stx\_blocks} sono
+identici agli analoghi (con prefisso \texttt{st\_}) dell'ordinaria struttura
+\struct{stat} illustrata in fig.~\ref{fig:file_stat_struct} e vale per essi
+quanto già detto in sez.~\ref{sec:file_stat} e seguenti.
+
+\begin{figure}[!htb]
+ \footnotesize
+ \centering
+ \begin{minipage}[c]{0.8\textwidth}
+ \includestruct{listati/statx_timestamp.h}
+ \end{minipage}
+ \normalsize
+ \caption{La struttura \structd{statx\_timestamp} per i tempi dei file con
+ \func{statx}. }
+ \label{fig:file_statx_timestamp_struct}
+\end{figure}
+
+Anche i campi \var{stx\_atime}, \var{stx\_mtime}, \var{stx\_ctime} mantengono
+questa analogia, ma esprimono i tempi di ultimo accesso, modifica e
+cambiamento con una precisione ed estensione maggiore grazie all'uso di una
+struttura dedicata \struct{statx\_timestamp} (riportata in
+fig.~\ref{fig:file_statx_timestamp_struct}) che consente di estendere i tempi
+dei file ad una granularità del nanosecondo e con un valore dello \textit{unix
+ time} (vedi sez.~\ref{sec:sys_unix_time}) a 64 bit, che non darà problemi di
+overflow per parecchio tempo (sicuramente ben oltre la durata di questa
+guida).
+
+Oltre ai precedenti, e a \val{stx\_mask} che abbiamo già visto e che indica
+quali delle informazioni richieste alla funzione sono state fornite,
+\func{statx} prevede una serie di informazioni aggiuntive fornite in
+altrettanti nuovi campi, illustrati nell'elenco seguente. È comunque previsto
+che in futuro \struct{statx} venga estesa per supportare ulteriori
+informazioni.
+
+\begin{basedescript}{\desclabelwidth{1.6cm}\desclabelstyle{\nextlinelabel}}
+\item[\var{stx\_btime}] In questo campo viene restituito il \textsl{tempo di
+ creazione} del file. Come detto in sez.~\ref{sec:file_file_times} questo
+ tempo normalmente non esiste in un sistema \textit{unix-like}, ma per
+ migliorare l'interoperabilità è stato aggiunto nelle versioni più recenti di
+ vari filesystem (come XFS, \acr{ext4}, ecc.) in modo che possa essere
+ utilizzato da servizi di condivisione dei file (è usato da \textsl{Samba},
+ ed è previsto nello standard di NFSv4).
+\item[\var{stx\_attributes\_mask}] in questo campo viene restituita una
+ maschera che indica quali sono i bit restituiti in \var{stx\_attributes}
+ effettivamente supportati per il file, e per poter utilizzare quest'ultimo
+ occorre sempre eseguire un AND aritmetico con \var{stx\_attributes\_mask} per
+ ottenere i valori validi.
+\item[\var{stx\_attributes}] in questo campo vengono restituiti gli eventuali
+ attributi addizionali posseduti dal file. Gran parte di questi sono quelli
+ impostati con i comandi \cmd{lsattr} e \cmd{chattr} ed abbiamo già incontrato
+ alcuni di essi in sez.~\ref{sec:file_perm_overview}. Gli attributi vengono
+ restituiti in forma di maschera binaria con i valori delle costanti elencate
+ in tab.~\ref{tab:statx_stx_attributes}, dove si trova anche la relativa
+ descrizione.
+\begin{table}[htb]
+ \centering
+ \footnotesize
+ \begin{tabular}[c]{|l|p{8cm}|}
+ \hline
+ \textbf{Costante} & \textbf{Significato} \\
+ \hline
+ \hline
+ \constd{STATX\_ATTR\_COMPRESSED}& Il file è compresso automaticamente dal
+ filesystem (quindi può richiedere un
+ maggior uso di risorse in caso di
+ accesso).\\
+ \constd{STATX\_ATTR\_IMMUTABLE} & Il file è marcato come
+ \textit{immutable} e non può essere
+ modificato in nessun modo (vedi
+ sez.~\ref{sec:file_perm_overview}).\\
+ \constd{STATX\_ATTR\_APPEND} & Il file è marcato come
+ \textit{append-only} e può essere
+ soltanto esteso in \textit{append} (vedi
+ sez.~\ref{sec:file_perm_overview}).\\
+ \constd{STATX\_ATTR\_NODUMP} & Il file è marcato per essere escluso da
+ eventuali backup a livello di filesystem
+ come quelli eseguiti con il comando
+ \cmd{dump}.\\
+ \constd{STATX\_ATTR\_ENCRYPTED} & Il file è cifrato sul filesystem ed è
+ necessaria una chiave di accesso per
+ decifrarne il contenuto.\\
+ \constd{STATX\_ATTR\_AUTOMOUNT} & Il file, in questo caso in genere una
+ directory, è marcata come punto di
+ innesco per un \textit{automount}.\\
+ \hline
+ \end{tabular}
+ \caption{Le costanti degli attributi addizionali restituiti in
+ \var{stx\_attributes}.}
+ \label{tab:statx_stx_attributes}
+\end{table}
+
+\item[\var{stx\_rdev\_major}, \var{stx\_rdev\_minor}] in questi campi vengono
+ restituiti rispettivamente \textit{major number} e \textit{minor number} del
+ file quando questo è un file di dispositivo (fanno le veci del campo
+ \var{st\_rdev} di \struct{stat}).
+
+\item[\var{stx\_dev\_major}, \var{stx\_dev\_minor}] in questi campi vengono
+ restituiti \textit{major number} e \textit{minor number} del dispositivo su
+ cui risiede il file (fanno le veci del campo \var{st\_dev} di \struct{stat}).
+\end{basedescript}
+
+Di questi campi \var{stx\_mode}, \var{stx\_nlink}, \var{stx\_uid},
+\var{stx\_gid}, \var{stx\_ino}, \var{stx\_size} e \var{stx\_blocks} e quelli
+relativi ai tempi ordinari dei file vengono sempre restituiti, ed il relativo
+valore in \struct{statx} sovrascritto, indipendentemente dal fatto che siano
+stati richiesti o no, con \var{stx\_mask} che indicherà quali sono quelli che
+hanno valori effettivamente validi.
+
+Se un filesystem ha dei campi che non esistono o hanno valori senza
+corrispondenza in un sistema unix-like, questi potranno essere restituiti con
+valori fittizi ricostruiti, ad esempio usando \ids{UID} e \ids{GID} impostati
+in fase di montaggio per un filesystem che non supporta gli utenti; in questi
+casi il relativo bit in \var{stx\_mask} sarà comunque cancellato. In caso di
+cambiamenti al file eseguiti in concorrenza a \func{statx} è possibile che
+campi diversi possano avere informazioni ottenute in momenti diversi, con
+valori precedenti o posteriori il cambiamento. Inoltre, se non richiesti
+esplicitamente, alcuni campi possono avere valori approssimati, ad esempio in
+caso di NFS, questi non vengono mai aggiornati dallo stato sul server remoto.
+
+Il campo \var{stx\_btime} viene restituito solo se richiesto, e si otterrà un
+valore nullo (ed il relativo bit in \var{stx\_mask} cancellato) se questo non
+esiste. Lo stesso vale nel caso si siano richiesti \var{stx\_rdev\_major} o
+\var{stx\_rdev\_minor} ed il file non è un file di dispositivo. I campi
+\var{stx\_dev\_major}, \var{stx\_dev\_minor} e \var{stx\_blksize} attengono
+ad informazioni locali, e sono sempre disponibili in maniera diretta.
+
+% NOTE: per statx https://lwn.net/Articles/707602/ e
+% https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=a528d35e8bfcc521d7cb70aaf03e1bd296c8493f)
+
+Infine trattiamo qui altre due funzioni, \func{fexecve} e \func{execveat}, che
+non attengono che in maniera indiretta all'uso dei file, ma sono comunque
+legate all'interfaccia delle \textit{at-functions}. In realtà la sola
+effettivamente collegata all'interfaccia delle \textit{at-functions} è la
+funzione di sistema \func{execveat}, introdotta con il kernel 3.19, e per la
+quale non è disponibile ancora un'interfaccia diretta nella \acr{glibc} che
+però la usa (quando disponibile) per realizzare \func{fexecve}.
+
+L'introduzione di queste funzioni nasce dall'esigenza di verificare i
+contenuti di un file eseguibile prima di eseguirlo. Fare il controllo (aprendo
+il file e verificandone il contenuto) e poi eseguirlo con \func{execve} è
+suscettibile alla possibilità che fra il controllo e l'esecuzione il nome del
+file o di una directory sovrastante venga cambiato.
+
+Per mitigare il problema nello standard POSIX.1-2008 è stata introdotta la
+funzione \funcd{fexecve} che consente di eseguire un programma usando un file
+descriptor al posto di un \textit{pathname}; il suo prototipo è:
+
+\begin{funcproto}{
+\fhead{unistd.h}
+\fdecl{int fexecve(int fd, char *const argv[], char *const envp[])}
+\fdesc{Esegue un programma da un file descriptor.}
+}
+
+{La funzione non ritorna in caso di successo e ritorna $-1$ per un errore,
+ nel qual caso \var{errno} assumerà uno dei valori:
+ \begin{errlist}
+ \item[\errcode{EINVAL}] \param{fd} non è un file descriptor, o \param{argv}
+ o \param{envp} sono \val{NULL}.
+ \item[\errcode{ENOSYS}] il filesystem \file{proc} non è disponibile (prima
+ del kernel 3.19).
+ \end{errlist}
+ oltre a tutti gli errori già visti per \func{execve}.}
+\end{funcproto}
+
+La funzione esegue il programma contenuto nel file (su cui il chiamante deve
+avere il permesso di esecuzione) corrispondente a \param{fd}; questo deve
+essere stato ottenuto aprendo il relativo eseguibile in sola lettura o con
+\const{O\_PATH}. Questa funzione fino al kernel 3.19 veniva realizzata nella
+\acr{glibc} usando il filesystem \file{/proc} per ottenere da \param{fd} il
+file corrispondente in \file{/proc/self/fd/}, in maniera analoga a quanto
+visto per l'esempio di fig.~\ref{fig:initfile}.
+La funzione di sistema \funcd{execveat} è stata introdotta proprio per rendere
+più sicura l'esecuzione ed evitare la necessità di avere disponibile
+\file{/proc} per poter usare \func{fexecve}, il suo prototipo è:
-% 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)
+\begin{funcproto}{
+\fhead{unistd.h}
+\fdecl{int execveat(int dirfd, const char *pathname, char *const argv[], \\
+\phantom{int execveat(}char *const envp[], int flags)}
+\fdesc{Esegue un programma relativo ad una directory.}
+}
+
+{La funzione non ritorna in caso di successo e ritorna $-1$ per un errore, nel
+ qual caso \var{errno} assumerà, inoltre tutti gli errori già visti per
+ \func{execve}, uno dei valori:
+ \begin{errlist}
+ \item[\errcode{EBADF}] \param{fd} non è un file descriptor valido.
+ \item[\errcode{EINVAL}] \param{flags} non ha un valore valido.
+ \item[\errcode{ELOOP}] si è usato \const{AT\_SYMLINK\_NOFOLLOW} in
+ \param{flags} ma il file indicato è un link simbolico.
+ \item[\errcode{ENOENT}] il programma di cui si è richiesta l'esecuzione è
+ uno script, ma \func{dirfd} è aperto con il flag di
+ \textit{close-on-exec} e pertanto il programma non sarebbe accessibile
+ all'interprete.
+ \end{errlist}
+}
+\end{funcproto}
+La funzione segue la sintassi delle \textit{at-functions} per indicare il file
+da eseguire, e per il resto si comporta esattamente con come \func{execve} (le
+cui caratteristiche sono già state illustrate in
+sez.~\ref{sec:proc_exec}). Diventa così possibile indicare il programma da
+eseguire sia con un \textit{pathname} assoluto che relativo (usando
+\const{AT\_FDCWD} come \param{dirfd}), oppure con un \textit{pathname}
+relativo alla directory indicata da \param{dirfd}. In quest'ultima forma l'uso
+della funzione consente estendere i vantaggi delle \textit{at-functions} anche
+al caso dell'esecuzione di un programma.
+
+Inoltre usando, per \param{flags} il valore \const{AT\_EMPTY\_PATH}, si può
+indicare direttamente il file da eseguire aprendolo e passandone il file
+descriptor nell'argomento \param{dirfd}, ottenendo il comportamento di
+\func{fexecve}; quest'ultima infatti è sostanzialmente equivalente
+all'esecuzione di:
+\includecodesnip{listati/fexecve.c}
+l'unico altro valore utilizzabile per \param{flags} è
+\const{AT\_SYMLINK\_NOFOLLOW}, che fa fallire la funzione con un errore di
+\errval{ELOOP} se il file indicato è un link simbolico.
+
+Quando si usano \func{execveat} o \func{fexecve} per eseguire un programma
+attraverso un file descriptor è naturale impostare sullo stesso il flag di
+\textit{close-on-exec} in modo che questo venga automaticamente chiuso
+all'esecuzione. Questo evita di lasciare aperto inutilmente un file descriptor
+(un programma in genere non ha bisogno di avere un file aperto su se stesso),
+ma soprattutto evita problemi in caso di un eventuale uso ricorsivo di queste
+funzioni, in tal caso infatti, restando aperto ad ogni iterazione un ulteriore
+file descriptor, si potrebbe arrivare all'esaurimento degli stessi.
+
+Tutto questo però non è vero quando si vuole eseguire uno script; in tal caso
+infatti (si ricordi quanto detto a questo riguardo in
+sez.~\ref{sec:proc_exec}) il programma che viene effettivamente messo in
+esecuzione è l'interprete indicato nella riga iniziale dello script, che poi
+legge ed interpreta il codice da eseguire dallo script stesso. Ma se lancia lo
+script usando un file descriptor su cui è attivo il flag di
+\textit{close-on-exec}, questo sarà già chiuso quando l'interprete viene posto
+in esecuzione, rendendo impossibile la lettura del programma da
+interpretare.
+
+Per questo motivo, quando ci si trova in questa situazione, \func{execveat} (e
+quindi anche \func{fexecve}) eseguono un controllo preventivo e falliscono con
+un errore di \errval{ENOENT}. Pertanto se si vuole eseguire uno script
+passandone il file descriptor l'unica possibilità è non attivare il flag di
+\textit{close-on-exec}, esponendosi però al rischio di incorrere nei problemi
+accennati in precedenza.
% TODO: manca prototipo e motivazione di fexecve, da trattare qui in quanto
% inserita nello stesso standard e da usare con openat, vedi
% http://pubs.opengroup.org/onlinepubs/9699939699/toc.pdf
+
% TODO manca prototipo di execveat, introdotta nel 3.19, vedi
% https://lwn.net/Articles/626150/ cerca anche fexecve
-% TODO: manca prototipo e motivazione di execveat, vedi
-% http://man7.org/linux/man-pages/man2/execveat.2.html
% TODO: trattare i nuovi AT_flags quando e se arriveranno, vedi
\itindend{at-functions}
-\subsection{Le operazioni di controllo}
+\subsection{Le operazioni di controllo sui file descriptor}
\label{sec:file_fcntl_ioctl}
Oltre alle operazioni base esaminate in sez.~\ref{sec:file_unix_interface}
ma la gestione sia delle loro proprietà, che di tutta una serie di ulteriori
funzionalità che il kernel può mettere a disposizione.
-% TODO: trattare qui i file seal
-
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
- 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}
\fhead{fcntl.h}
\fdecl{int fcntl(int fd, int cmd)}
-\fdecl{int fcntl(int fd, int cmd, long arg)}
-\fdecl{int fcntl(int fd, int cmd, struct flock * lock)}
-\fdecl{int fcntl(int fd, int cmd, struct f\_owner\_ex * owner)}
-\fdesc{Esegue una operazione di controllo sul file.}
+\fdecl{int fcntl(int fd, int cmd, int arg)}
+\fdecl{int fcntl(int fd, int cmd, ...)}
+\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,
- l'unico valido in generale è:
+ 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
+ corrente.
\end{errlist}
}
\end{funcproto}
Il primo argomento della funzione è sempre il numero di file descriptor
\var{fd} su cui si vuole operare. Il comportamento di questa funzione, il
numero e il tipo degli argomenti, il valore di ritorno e gli eventuali errori
-aggiuntivi, sono determinati dal valore dell'argomento \param{cmd} che in
-sostanza corrisponde all'esecuzione di un determinato \textsl{comando}. A
-seconda del comando specificato il terzo argomento può essere assente (ma se
-specificato verrà ignorato), può assumere un valore intero di tipo
-\ctyp{long}, o essere un puntatore ad una struttura \struct{flock}.
+aggiuntivi, sono determinati dal valore del secondo argomento \param{cmd}, che
+serve a specificare il ``\textsl{comando}'' della funzione, in sostanza quale
+operazione si intende eseguire. A seconda del comando richiesto il terzo
+argomento può essere assente (ma se specificato lo stesso verrà semplicemente
+ignorato) ed in generale dipende dal comando \param{cmd}; il caso più comune è
+quello di un intero, ma ci sono comandi in cui si devono usare dei tipi
+specifici, che descriveremo esplicitamente nei singoli casi.
In sez.~\ref{sec:file_dup} abbiamo incontrato un esempio dell'uso di
\func{fcntl} per la duplicazione dei file descriptor, una lista di tutti i
il nome indicato nel precedente prototipo), è riportata di seguito:
\begin{basedescript}{\desclabelwidth{1.8cm}}
\item[\constd{F\_DUPFD}] trova il primo file descriptor disponibile di valore
- maggiore o uguale ad \param{arg}, e ne fa un duplicato
- di \param{fd}, ritorna il nuovo file descriptor in caso di successo e $-1$
- in caso di errore. Oltre a \errval{EBADF} gli errori possibili sono
+ maggiore o uguale all'argomento \param{arg}, e ne fa un duplicato di
+ \param{fd}, ritorna il nuovo file descriptor in caso di successo e $-1$ in
+ caso di errore. Oltre a \errval{EBADF} gli errori possibili sono
\errcode{EINVAL} se \param{arg} è negativo o maggiore del massimo consentito
o \errcode{EMFILE} se il processo ha già raggiunto il massimo numero di
descrittori consentito.
-\itindbeg{close-on-exec}
-
\item[\constd{F\_DUPFD\_CLOEXEC}] ha lo stesso effetto di \const{F\_DUPFD}, ma
in più attiva il flag di \textit{close-on-exec} sul file descriptor
duplicato, in modo da evitare una successiva chiamata con
sez.~\ref{sec:intro_gcc_glibc_std}).
\item[\constd{F\_GETFD}] restituisce il valore dei \textit{file descriptor
- flags} di \param{fd} in caso di successo o $-1$ in caso di errore, il
- terzo argomento viene ignorato. Non sono previsti errori diversi da
- \errval{EBADF}. Al momento l'unico flag usato è quello di
- \textit{close-on-exec}, identificato dalla costante \const{FD\_CLOEXEC}, che
- serve a richiedere che il file venga chiuso nella esecuzione di una
- \func{exec} (vedi sez.~\ref{sec:proc_exec}). Un valore nullo significa
- pertanto che il flag non è impostato.
+ flags} (vedi sez.~\ref{sec:file_shared_access}) di \param{fd} in caso di
+ successo o $-1$ in caso di errore, il terzo argomento viene ignorato. Non
+ sono previsti errori diversi da \errval{EBADF}. Al momento l'unico flag
+ usato è quello di \textit{close-on-exec}, identificato dalla costante
+ \const{FD\_CLOEXEC}, che serve a richiedere che il file venga chiuso nella
+ esecuzione di una \func{exec} (vedi sez.~\ref{sec:proc_exec}). Un valore
+ nullo significa pertanto che il flag non è impostato.
\item[\constd{F\_SETFD}] imposta il valore dei \textit{file descriptor flags}
- al valore specificato con \param{arg}, ritorna un valore nullo in caso di
- successo e $-1$ in caso di errore. Non sono previsti errori diversi da
- \errval{EBADF}. Dato che l'unico flag attualmente usato è quello di
- \textit{close-on-exec}, identificato dalla costante \const{FD\_CLOEXEC},
- tutti gli altri bit di \param{arg}, anche se impostati, vengono
- ignorati.\footnote{questo almeno è quanto avviene fino al kernel 3.2, come
- si può evincere dal codice della funzione \texttt{do\_fcntl} nel file
- \texttt{fs/fcntl.c} dei sorgenti del kernel.}
-\itindend{close-on-exec}
+ (vedi sez.~\ref{sec:file_shared_access}) al valore specificato con
+ \param{arg}, ritorna un valore nullo in caso di successo e $-1$ in caso di
+ errore. Non sono previsti errori diversi da \errval{EBADF}. Dato che l'unico
+ flag attualmente usato è quello di \textit{close-on-exec}, identificato
+ dalla costante \const{FD\_CLOEXEC}, tutti gli altri bit di \param{arg},
+ anche se impostati, vengono ignorati.\footnote{questo almeno è quanto
+ avviene fino al kernel 3.2, come si può evincere dal codice della funzione
+ \texttt{do\_fcntl} nel file \texttt{fs/fcntl.c} dei sorgenti del kernel.}
\item[\constd{F\_GETFL}] ritorna il valore dei \textit{file status flags} di
\param{fd} in caso di successo o $-1$ in caso di errore, il terzo argomento
dell'argomento \param{flags} di \func{open} che vengono memorizzati nella
relativa voce della \textit{file table} all'apertura del file, vale a dire
quelli riportati in tab.~\ref{tab:open_access_mode_flag} e
- tab.~\ref{tab:open_operation_flag}). Si ricordi che quando si usa la
- funzione per determinare le modalità di accesso con cui è stato aperto il
- file è necessario estrarre i bit corrispondenti nel \textit{file status
- flag} con la maschera \const{O\_ACCMODE} come già accennato in
- sez.~\ref{sec:file_open_close}.
+ tab.~\ref{tab:open_operation_flag}).
+
+ Si ricordi che quando si usa la funzione per determinare le modalità di
+ accesso con cui è stato aperto il file è necessario estrarre i bit
+ corrispondenti nel \textit{file status flag} con la maschera
+ \const{O\_ACCMODE} come già accennato in sez.~\ref{sec:file_open_close}.
\item[\constd{F\_SETFL}] imposta il valore dei \textit{file status flags} al
valore specificato da \param{arg}, ritorna un valore nullo in caso di
successo o $-1$ in caso di errore. In generale possono essere impostati solo
i flag riportati in tab.~\ref{tab:open_operation_flag}, su Linux si possono
modificare soltanto \const{O\_APPEND}, \const{O\_ASYNC}, \const{O\_DIRECT},
- \const{O\_NOATIME} e \const{O\_NONBLOCK}. Oltre a \errval{EBADF} si otterrà
- \errcode{EPERM} se si cerca di rimuovere \const{O\_APPEND} da un file
- marcato come \textit{append-only} o se di cerca di impostare
- \const{O\_NOATIME} su un file di cui non si è proprietari (e non si hanno i
- permessi di amministratore) ed \errcode{EINVAL} se si cerca di impostare
- \const{O\_DIRECT} su un file che non supporta questo tipo di operazioni.
-
-\item[\constd{F\_GETLK}] richiede un controllo sul file lock specificato da
- \param{lock}, sovrascrivendo la struttura da esso puntata 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 \errval{EBADF} se \param{lock} non è un
- puntatore valido restituisce l'errore generico \errcode{EFAULT}. Questa
- funzionalità è trattata in dettaglio in sez.~\ref{sec:file_posix_lock}.
+ \const{O\_NOATIME} e \const{O\_NONBLOCK}.
+
+ Oltre a \errval{EBADF} si otterrà \errcode{EPERM} se si cerca di rimuovere
+ \const{O\_APPEND} da un file marcato come \textit{append-only} o se di cerca
+ di impostare \const{O\_NOATIME} su un file di cui non si è proprietari (e
+ non si hanno i permessi di amministratore) ed \errcode{EINVAL} se si cerca
+ di impostare \const{O\_DIRECT} su un file che non supporta questo tipo di
+ operazioni.
+
+\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
+ $-1$ in caso di errore. Come per i due successivi comandi oltre a
+ \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}.
-\item[\constd{F\_SETLK}] richiede o rilascia un file lock a seconda di quanto
- specificato nella struttura puntata da \param{lock}, ritorna un valore nullo
- in caso di successo e $-1$ se il file lock è tenuto da qualcun altro, nel
- qual caso si ha un errore di \errcode{EACCES} o \errcode{EAGAIN}. Questa
- funzionalità è trattata in dettaglio in sez.~\ref{sec:file_posix_lock}.
+\item[\constd{F\_SETLK}] richiede o rilascia un \textit{file lock} a seconda
+ di quanto specificato nella struttura puntata dal terzo argomento (sempre di
+ tipo \ctyp{struct flock *}); ritorna un valore nullo in caso di successo e
+ $-1$ se il \textit{file lock} è tenuto da qualcun altro, nel qual caso si ha
+ un errore di \errcode{EACCES} o \errcode{EAGAIN}. Questa funzionalità è
+ trattata in dettaglio in sez.~\ref{sec:file_posix_lock}.
\item[\constd{F\_SETLKW}] identica a \const{F\_SETLK} eccetto per il fatto che
la funzione non ritorna subito ma attende che il blocco sia rilasciato, se
imposta \var{errno} a \errcode{EINTR}. Questa funzionalità è trattata in
dettaglio in sez.~\ref{sec:file_posix_lock}.
+\item[\constd{F\_OFD\_GETLK}] analoga di \constd{F\_GETLK} ma per i nuovi
+ \textit{open file descriptor locks} introdotti con il kernel 3.15, 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 $-1$ in caso di errore. Come
+ per i due successivi comandi oltre a \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:open_file_descriptor_locks}.
+
+\item[\constd{F\_OFD\_SETLK}] analoga di \constd{F\_SETLK} ma per i nuovi
+ \textit{open file descriptor locks} introdotti con il kernel 3.15, richiede
+ o rilascia un \textit{file lock} a seconda di quanto specificato nella
+ struttura puntata dal terzo argomento (sempre di tipo \ctyp{struct flock
+ *}); ritorna un valore nullo in caso di successo e $-1$ se il \textit{file
+ lock} è tenuto da qualcun altro, nel qual caso si ha un errore di
+ \errcode{EACCES} o \errcode{EAGAIN}. Questa funzionalità è trattata in
+ dettaglio in sez.~\ref{sec:open_file_descriptor_locks}.
+
+\item[\constd{F\_OFD\_SETLKW}] identica a \const{F\_OFD\_SETLK} eccetto per il
+ fatto che la funzione non ritorna subito ma attende che il blocco sia
+ rilasciato, se l'attesa viene interrotta da un segnale la funzione
+ restituisce $-1$ e imposta \var{errno} a \errcode{EINTR}. Questa
+ funzionalità è trattata in dettaglio in
+ sez.~\ref{sec:open_file_descriptor_locks}.
+
\item[\constd{F\_GETOWN}] restituisce in caso di successo l'identificatore del
processo o del \textit{process group} (vedi sez.~\ref{sec:sess_proc_group})
- che è preposto alla ricezione del segnale \signal{SIGIO} (o l'eventuale
- segnale alternativo impostato con \const{F\_SETSIG}) per gli eventi
- asincroni associati al file descriptor \param{fd} e del segnale
- \signal{SIGURG} per la notifica dei dati urgenti di un socket (vedi
- sez.~\ref{sec:TCP_urgent_data}). Restituisce $-1$ in caso di errore ed il
- terzo argomento viene ignorato. Non sono previsti errori diversi da
- \errval{EBADF}.
+ che è preposto alla ricezione dei segnali \signal{SIGIO} o \signal{SIGURG};
+ il primo (o l'eventuale segnale alternativo impostato con \const{F\_SETSIG})
+ per gli eventi asincroni associati al file descriptor \param{fd} (vedi
+ sez.~\ref{sec:file_asyncronous_operation}), il secondo per la notifica dei
+ dati urgenti di un socket (vedi sez.~\ref{sec:TCP_urgent_data}). Restituisce
+ $-1$ in caso di errore ed il terzo argomento viene ignorato. Non sono
+ previsti errori diversi da \errval{EBADF}.
Per distinguerlo dal caso in cui il segnale viene inviato a un singolo
processo, nel caso di un \textit{process group} viene restituito un valore
il comportamento del comando può risultare diverso a seconda delle versioni
della \acr{glibc} e del kernel.
-\item[\constd{F\_SETOWN}] imposta, con il valore dell'argomento \param{arg},
- l'identificatore del processo o del \textit{process group} che riceverà i
- 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} gli errori possibili sono
- \errcode{ESRCH} se \param{arg} indica un processo o un \textit{process
- group} inesistente.
+\item[\constd{F\_SETOWN}] imposta, con il valore del terzo argomento
+ \param{arg}, l'identificatore del processo o del \textit{process group} che
+ riceverà i segnali \signal{SIGIO} e \signal{SIGURG} per gli eventi asincroni
+ associati al file descriptor \param{fd}. Ritorna un valore nullo in caso di
+ successo o $-1$ in caso di errore. Oltre a \errval{EBADF} gli errori
+ possibili sono \errcode{ESRCH} se \param{arg} indica un processo o un
+ \textit{process group} inesistente.
L'impostazione è soggetta alle stesse restrizioni presenti sulla funzione
\func{kill} (vedi sez.~\ref{sec:sig_kill_raise}), per cui un utente non
valore negativo, il cui valore assoluto corrisponda all'identificatore del
\textit{process group}.
- A partire dal kernel 2.6.12 se si sta operando con i \textit{thread} della
+ A partire dal kernel 2.6.12, se si sta operando con i \textit{thread} della
implementazione nativa di Linux (quella della NTPL, vedi
sez.~\ref{sec:linux_ntpl}) e se si è impostato un segnale specifico con
\const{F\_SETSIG}, un valore positivo di \param{arg} viene interpretato come
indicante un \textit{Thread ID} e non un \textit{Process ID}. Questo
consente di inviare il segnale impostato con \const{F\_SETSIG} ad uno
- specifico \textit{thread}. In genere questo non comporta differenze
- significative per il processi ordinari, in cui non esistono altri
- \textit{thread}, dato che su Linux il \textit{thread} principale, che in tal
- caso è anche l'unico, mantiene un valore del \textit{Thread ID} uguale al
- \ids{PID} del processo. Il problema è però che questo comportamento non si
- applica a \signal{SIGURG}, per il quale \param{arg} viene sempre
- interpretato come l'identificatore di un processo o di un \textit{process
- group}.
-
-\item[\constd{F\_GETOWN\_EX}] legge nella struttura puntata
- dall'argomento \param{owner} l'identificatore del processo, \textit{thread}
- o \textit{process group} (vedi sez.~\ref{sec:sess_proc_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.
+ specifico \textit{thread}.
+
+ In genere questo non comporta differenze significative per il processi
+ ordinari, in cui non esistono altri \textit{thread}, dato che su Linux il
+ \textit{thread} principale, che in tal caso è anche l'unico, mantiene un
+ valore del \textit{Thread ID} uguale al \ids{PID} del processo. Il problema
+ è però che questo comportamento non si applica a \signal{SIGURG}, per il
+ quale \param{arg} viene sempre interpretato come l'identificatore di un
+ processo o di un \textit{process group}.
+
+\item[\constd{F\_GETOWN\_EX}] legge nella struttura puntata dal terzo
+ argomento (che deve essere di tipo \ctyp{struct f\_owner\_ex *})
+ 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} 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
consente di superare i limiti e le ambiguità relative ai valori restituiti
come identificativo. A partire dalla versione 2.11 della \acr{glibc} esso
viene usato dalla libreria per realizzare una versione di \func{fcntl} che
- non presenti i problemi illustrati in precedenza per la versione precedente
- di \const{F\_GETOWN}. Il comando è specifico di Linux ed utilizzabile solo
- se si è definita la macro \macro{\_GNU\_SOURCE}.
-
-\item[\constd{F\_SETOWN\_EX}] imposta con il valore della struttura
- \struct{f\_owner\_ex} puntata \param{owner}, l'identificatore del processo o
- del \textit{process group} che riceverà i 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, con gli stessi errori di \const{F\_SETOWN} più
- \errcode{EINVAL} se il campo \var{type} di \struct{f\_owner\_ex} non indica
- un tipo di identificatore valido.
-
+ non presenti i problemi illustrati in precedenza per \const{F\_GETOWN}. Il
+ comando è specifico di Linux ed utilizzabile solo se si è definita la macro
+ \macro{\_GNU\_SOURCE}.
+
\begin{figure}[!htb]
\footnotesize \centering
\begin{varwidth}[c]{0.5\textwidth}
\label{fig:f_owner_ex}
\end{figure}
+\item[\constd{F\_SETOWN\_EX}] imposta con il valore della struttura puntata
+ dal terzo argomento (che deve essere di tipo \ctyp{struct f\_owner\_ex *})
+ l'identificatore del processo o del \textit{process group} che riceverà i
+ 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, con gli stessi errori di \const{F\_SETOWN} più
+ \errcode{EINVAL} se il campo \var{type} di \struct{f\_owner\_ex} non indica
+ 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 primo campo indica il tipo
- di identificatore il cui valore è specificato nel secondo campo, che assume
- lo stesso significato di \param{arg} per \const{F\_SETOWN}. Per il campo
- \var{type} i soli valori validi sono \constd{F\_OWNER\_TID},
+ 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}.
+
+ Per \var{type} i soli valori validi sono \constd{F\_OWNER\_TID},
\constd{F\_OWNER\_PID} e \constd{F\_OWNER\_PGRP}, che indicano
rispettivamente che si intende specificare con \var{pid} un \textit{Tread
ID}, un \textit{Process ID} o un \textit{Process Group ID}. A differenza
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}.
-\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
L'impostazione di un valore diverso da zero permette inoltre, se si è
installato il gestore del segnale come \var{sa\_sigaction} usando
- \const{SA\_SIGINFO}, (vedi sez.~\ref{sec:sig_sigaction}), di rendere
+ \const{SA\_SIGINFO} (vedi sez.~\ref{sec:sig_sigaction}), di rendere
disponibili al gestore informazioni ulteriori riguardo il file che ha
generato il segnale attraverso i valori restituiti in
\struct{siginfo\_t}. Se inoltre si imposta un segnale \textit{real-time} si
solo se si è definita la macro \macro{\_GNU\_SOURCE}. Questa funzionalità è
trattata in dettaglio in sez.~\ref{sec:file_asyncronous_lease}.
-\item[\constd{F\_SETLEASE}] imposta o rimuove a seconda del valore
- di \param{arg} un \textit{file lease} sul file descriptor \var{fd} a seconda
- del valore indicato da \param{arg}. Ritorna un valore nullo in caso di
- successo o $-1$ in caso di errore. Oltre a \errval{EBADF} si otterrà
- \errcode{EINVAL} se si è specificato un valore non valido per \param{arg}
- (deve essere usato uno dei 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.\footnote{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}.
+\item[\constd{F\_SETLEASE}] imposta o rimuove a seconda del valore del terzo
+ argomento \param{arg} un \textit{file lease} sul file descriptor
+ \var{fd}. Ritorna un valore nullo in caso di successo o $-1$ in caso di
+ errore. Oltre a \errval{EBADF} si otterrà \errcode{EINVAL} se si è
+ specificato un valore non valido per \param{arg} (deve essere usato uno dei
+ 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},
+ 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
gli errori possibili sono \errcode{EBUSY} se si cerca di ridurre la
dimensione del buffer al di sotto della quantità di dati effettivamente
presenti su di esso ed \errcode{EPERM} se un processo non privilegiato cerca
- di impostare un valore troppo alto. La dimensione minima del buffer è pari
- ad una pagina di memoria, a cui verrà comunque arrotondata ogni dimensione
- inferiore, il valore specificato viene in genere arrotondato per eccesso al
- valore ritenuto più opportuno dal sistema, pertanto una volta eseguita la
- 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 superiore a quello indicato da
- \sysctlfiled{fs/pipe-size-max}. Il comando è specifico di Linux, è
+ di impostare un valore troppo alto.
+
+ La dimensione minima del buffer è pari ad una pagina di memoria, a cui verrà
+ comunque arrotondata ogni dimensione inferiore, il valore specificato viene
+ in genere arrotondato per eccesso al valore ritenuto più opportuno dal
+ sistema, pertanto una volta eseguita la modifica è opportuno rileggere la
+ nuova dimensione con \const{F\_GETPIPE\_SZ}.
+
+ I processi non privilegiati (occorre la capacità \const{CAP\_SYS\_RESOURCE})
+ non possono impostare un valore superiore a quello indicato da
+ \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
+ \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
+ 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
+ sez.~\ref{sec:file_seal_et_al}.
+
+\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
+ *}. 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 4.13. Questa funzionalità è trattata in dettaglio in
+ sez.~\ref{sec:file_fadvise}.
+
+\item[\constd{F\_SET\_RW\_HINT}] imposta il valore dei \textit{read/write
+ hints} associati all'\textit{inode} a cui fa riferimento \param{fd}; il
+ valore deve essere fornito nella variabile puntata dal terzo argomento, che
+ deve essere di tipo \ctyp{uint64\_t *}. 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 4.13. Questa funzionalità è trattata
+ in dettaglio in sez.~\ref{sec:file_fadvise}.
+
+\item[\constd{F\_GET\_FILE\_RW\_HINT}] legge il valore dei \textit{read/write
+ hints} associati al file descriptor \param{fd} nella variabile puntata dal
+ terzo argomento che deve essere di tipo \ctyp{uint64\_t *}. 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 4.13. Questa
+ funzionalità è trattata in dettaglio in sez.~\ref{sec:file_fadvise}.
+
+\item[\constd{F\_SET\_FILE\_RW\_HINT}] legge il valore dei \textit{read/write
+ hints} associati al file descriptor \param{fd}; il valore deve essere
+ fornito nella variabile puntata dal terzo argomento, che deve essere di tipo
+ \ctyp{uint64\_t *}. 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 4.13. Questa funzionalità è trattata in dettaglio in
+ sez.~\ref{sec:file_fadvise}.
+
+
\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
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} mentre quelle relative al
-\textit{file locking} saranno esaminate in sez.~\ref{sec:file_locking}). L'uso
-di questa funzione con i socket verrà trattato in
-sez.~\ref{sec:sock_ctrl_func}.
+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_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}.
La gran parte dei comandi di \func{fcntl} (come \const{F\_DUPFD},
\const{F\_GETFD}, \const{F\_SETFD}, \const{F\_GETFL}, \const{F\_SETFL},
funzionalità di sez.~\ref{sec:intro_gcc_glibc_std} soltanto per le
funzionalità inserite in standard successivi o specifiche di Linux.
-
-% \subsection{La funzione \func{ioctl}}
-% \label{sec:file_ioctl}
-
Benché l'interfaccia di gestione dell'I/O sui file di cui abbiamo parlato
finora si sia dimostrata valida anche per l'interazione diretta con le
periferiche attraverso i loro file di dispositivo, consentendo di usare le
Per questo motivo nell'architettura del sistema è stata prevista l'esistenza
di una apposita funzione di sistema, \funcd{ioctl}, come meccanismo generico
-per compiere operazioni specializzate; il suo prototipo è:
+per compiere operazioni specialistiche; il suo prototipo è:
\begin{funcproto}{
\fhead{sys/ioctl.h}
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 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
sono definite nel kernel a livello generale, e vengono sempre interpretate per
prime, per cui, come illustrato in \cite{LinDevDri}, eventuali operazioni
specifiche che usino lo stesso valore verrebbero ignorate:
-\begin{basedescript}{\desclabelwidth{2.0cm}}
+\begin{basedescript}{\desclabelwidth{1.8cm}}
\item[\constd{FIOCLEX}] imposta il flag di \textit{close-on-exec} sul file, in
questo caso, essendo usata come operazione logica, \func{ioctl} non richiede
un terzo argomento, il cui eventuale valore viene ignorato.
% 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}
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}.
Per rispondere ad esigenze diverse lo standard definisce tre distinte modalità
in cui può essere eseguita la bufferizzazione, delle quali occorre essere ben
consapevoli, specie in caso di lettura e scrittura da dispositivi interattivi:
-\begin{itemize}
+\begin{itemize*}
\item \textit{unbuffered}: in questo caso non c'è bufferizzazione ed i
caratteri vengono trasmessi direttamente al file non appena possibile
(effettuando immediatamente una \func{write});
quando si preme invio);
\item \textit{fully buffered}: in questo caso i caratteri vengono
trasmessi da e verso il file in blocchi di dimensione opportuna.
-\end{itemize}
+\end{itemize*}
Lo standard ANSI C specifica inoltre che lo \textit{standard output} e lo
\textit{standard input} siano aperti in modalità \textit{fully buffered}
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
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
-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.
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:
-\begin{itemize}
-\item\textsl{binario} in cui si leggono e scrivono blocchi di dati di
- dimensione arbitraria, (analogo della modalità ordinaria dell'I/O sui file
- descriptor), trattato in sez.~\ref{sec:file_binary_io}.
-\item\textsl{a caratteri} in cui si legge e scrive un carattere alla volta,
- con la bufferizzazione che viene gestita automaticamente dalla libreria,
- trattato in sez.~\ref{sec:file_char_io}.
-\item\textsl{di linea} in cui si legge e scrive una linea alla volta,
- (terminata dal carattere di newline \verb|'\n'|), trattato in
- sez.~\ref{sec:file_line_io}.
-\end{itemize}
-a cui si aggiunge la modalità di input/output formattato, trattato in
-sez.~\ref{sec:file_formatted_io}.
-
-Ognuna di queste modalità utilizza per l'I/O delle funzioni specifiche che
-vedremo nelle sezioni citate, affronteremo qui tutte gli argomenti e le
-funzioni che si applicano in generale a tutte le modalità di I/O.
-
-A differenza di quanto avviene con l'interfaccia dei file descriptor, con gli
-\textit{stream} il raggiungimento della fine del file viene considerato un
-errore, e viene notificato come tale dai valori di uscita delle varie
-funzioni. Nella maggior parte dei casi questo avviene con la restituzione del
-valore intero (di tipo \ctyp{int}) \val{EOF} definito anch'esso nell'header
+\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à
+ ordinaria dell'input/output sui file descriptor vista in
+ sez.~\ref{sec:file_read} e \ref{sec:file_write}.
+\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
+ 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
+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 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
+della fine del file viene considerato un errore, che viene notificato come
+tale dai valori di uscita delle varie funzioni.
+
+In vari casi questo avviene con la restituzione di uno specifico
+valore intero (di tipo \ctyp{int}) definito come \val{EOF} nell'header
\headfile{stdlib.h}. La costante deve essere negativa perché in molte funzioni
-un valore positivo indica la quantità di dati scritti, la \acr{glibc} usa il
-valore $-1$, ma altre implementazioni possono avere valori diversi.
+un valore positivo indica la quantità di dati scritti e ci potrebbe essere
+sovrapposizione, la \acr{glibc} usa il valore $-1$, ma altre implementazioni
+possono avere valori diversi.
Dato che le funzioni dell'interfaccia degli \textit{stream} sono funzioni di
-libreria che si appoggiano a delle \textit{system call}, esse non impostano
-direttamente la variabile \var{errno}, che mantiene sempre il valore impostato
-dalla \textit{system call} invocata internamente che ha riportato l'errore.
+libreria realizzate usando delle \textit{system call}, esse non modificano mai
+direttamente la variabile \var{errno}, che in caso di errore mantiene sempre
+il valore impostato dalla \textit{system call} sottostante che lo ha
+riportato.
Siccome la condizione di \textit{end-of-file} è anch'essa segnalata come
-errore, nasce il problema di come distinguerla da un errore effettivo; basarsi
-solo sul valore di ritorno della funzione e controllare il valore di
-\var{errno} infatti non basta, dato che quest'ultimo potrebbe essere stato
-impostato in una altra occasione, (si veda sez.~\ref{sec:sys_errno} per i
-dettagli del funzionamento di \var{errno}).
+errore, nasce il problema di come distinguerla; basarsi solo sul valore di
+ritorno della funzione e controllare il valore di \var{errno} infatti non
+basta, dato che quest'ultimo potrebbe essere stato impostato in una altra
+occasione, (si veda sez.~\ref{sec:sys_errno} per i dettagli del funzionamento
+di \var{errno}).
Per questo motivo tutte le implementazioni delle librerie standard mantengono
per ogni \textit{stream} almeno due flag all'interno dell'oggetto \type{FILE},
% TODO: mettere prototipi espliciti fseeko e ftello o menzione?
-\subsection{Input/output binario}
-\label{sec:file_binary_io}
+\subsection{Input/output non formattato}
+\label{sec:file_unformatted_io}
La prima modalità di input/output non formattato ricalca quella della
interfaccia dei file descriptor, e provvede semplicemente la scrittura e la
\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)}
-\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
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
-
-
-\subsection{Input/output a caratteri}
-\label{sec:file_char_io}
-
-La seconda modalità di input/output è quella a caratteri, in cui si
-trasferisce un carattere alla volta. Le funzioni per la lettura a
+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
rispettivi prototipi sono:
operazioni di riposizionamento (vedi sez.~\ref{sec:file_io}) i caratteri
rimandati indietro vengono scartati.
-
-\subsection{Input/output di linea}
-\label{sec:file_line_io}
-
La terza ed ultima modalità di input/output non formattato è quella di linea,
in cui si legge o si scrive una riga alla volta. Questa è la modalità usata
normalmente per l'I/O da terminale, ed è anche quella che presenta le
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
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
-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
\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
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
\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
\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
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
% 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:
% LocalWords: FIONREAD epoll FIOQSIZE side effects SAFE BYCALLER QUERY EACCES
% LocalWords: EBUSY OpenBSD syncfs futimes timespec only init ESRCH kill NTPL
% LocalWords: ENXIO NONBLOCK WRONLY EPERM NOATIME ETXTBSY EWOULDBLOCK PGRP SZ
-% LocalWords: EFAULT capabilities GETPIPE SETPIPE RESOURCE NFSv
-% LocalWords: Documentation Urlich Drepper futimesat times
-% LocalWords: futimens fs Tread TMPFILE EDQUOT extN Minix UDF XFS
+% LocalWords: EFAULT capabilities GETPIPE SETPIPE RESOURCE NFSv InitFile stx
+% LocalWords: Documentation Urlich Drepper futimesat times FullWrite major
+% LocalWords: futimens fs Tread TMPFILE EDQUOT extN Minix UDF XFS mask all'
% LocalWords: shmem Btrfs ubifs tmpfile fchmod fchown fsetxattr fchdir PF
-% LocalWords: fstatfs SIGTTIN EDESTADDRREQ datagram connect seal pag
+% LocalWords: fstatfs SIGTTIN EDESTADDRREQ datagram connect seal pag l'I INO
% LocalWords: dirty execveat execve scandirat statx AUTOMOUNT automount DAC
-% LocalWords: wrapper EMPTY olddirfd oldpath newdirfd newpath capability
+% 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
+% LocalWords: renamat syscall whiteout overlay filesytem Live nell' sull'
+% 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:
+% LocalWords: mapping