%% fileadv.tex
%%
-%% Copyright (C) 2000-2015 Simone Piccardi. Permission is granted to
+%% Copyright (C) 2000-2018 Simone Piccardi. Permission is granted to
%% copy, distribute and/or modify this document under the terms of the GNU Free
%% Documentation License, Version 1.1 or any later version published by the
%% Free Software Foundation; with the Invariant Sections being "Un preambolo",
\item[\errcode{EINVAL}] si è usato un valore non valido per \param{cmd}.
\end{errlist}
ed inoltre \errcode{EDEADLK} e \errcode{ENOLCK} con lo stesso significato
- che hanno con \funcd{fcntl}.
+ che hanno con \func{fcntl}.
}
\end{funcproto}
attuale delle cose è sconsigliabile fare affidamento sul \textit{mandatory
locking}.
+% TODO il supporto è stato reso opzionale nel 4.5, verrà eliminato nel futuro
+% (vedi http://lwn.net/Articles/667210/)
+
\itindend{file~locking}
\itindend{mandatory~locking}
\vspace{3pt}
\begin{funcbox}{
\fhead{sys/select.h}
-\fdecl{void \macro{FD\_ZERO}(fd\_set *set)}
+\fdecl{void \macrod{FD\_ZERO}(fd\_set *set)}
\fdesc{Inizializza l'insieme (vuoto).}
-\fdecl{void \macro{FD\_SET}(int fd, fd\_set *set)}
+\fdecl{void \macrod{FD\_SET}(int fd, fd\_set *set)}
\fdesc{Inserisce il file descriptor \param{fd} nell'insieme.}
-\fdecl{void \macro{FD\_CLR}(int fd, fd\_set *set)}
+\fdecl{void \macrod{FD\_CLR}(int fd, fd\_set *set)}
\fdesc{Rimuove il file descriptor \param{fd} dall'insieme.}
-\fdecl{int \macro{FD\_ISSET}(int fd, fd\_set *set)}
+\fdecl{int \macrod{FD\_ISSET}(int fd, fd\_set *set)}
\fdesc{Controlla se il file descriptor \param{fd} è nell'insieme.}
}
\end{funcbox}}
ed è utile per riconoscere la chiusura di una connessione dall'altro capo di
un socket quando si lavora in modalità \textit{edge triggered}.}
+% TODO aggiunto con il kernel 4.5 EPOLLEXCLUSIVE, vedi
+% http://lwn.net/Articles/633422/#excl
+
Il secondo campo, \var{data}, è una \dirct{union} che serve a identificare il
file descriptor a cui si intende fare riferimento, ed in astratto può
contenere un valore qualsiasi (specificabile in diverse forme) che ne permetta
{La funzione ritorna il numero di file descriptor pronti in caso di successo e
$-1$ per un errore, nel qual caso \var{errno} assumerà uno dei valori già
- visti con \funcd{epoll\_wait}.
+ visti con \func{epoll\_wait}.
}
\end{funcproto}
-La funzione è del tutto analoga \funcd{epoll\_wait}, soltanto che alla sua
+La funzione è del tutto analoga \func{epoll\_wait}, soltanto che alla sua
uscita viene ripristinata la maschera di segnali originale, sostituita durante
l'esecuzione da quella impostata con l'argomento \param{sigmask}; in sostanza
la chiamata a questa funzione è equivalente al seguente codice, eseguito però
unix-like, porti a notevoli problemi nell'interazione con le funzioni per
l'\textit{I/O multiplexing}, tanto che per evitare possibili \textit{race
condition} sono state introdotte estensioni dello standard POSIX e funzioni
-apposite come \func{pselect}, \func{ppoll} e \funcd{epoll\_pwait}.
+apposite come \func{pselect}, \func{ppoll} e \func{epoll\_pwait}.
Benché i segnali siano il meccanismo più usato per effettuare notifiche ai
processi, la loro interfaccia di programmazione, che comporta l'esecuzione di
ricezione leggendone la notifica tramite l'uso di uno speciale file
descriptor. Trattandosi di un file descriptor questo potrà essere tenuto sotto
osservazione con le ordinarie funzioni dell'\textit{I/O multiplexing} (vale a
-dire con le solite \func{select}, \func{poll} e \funcd{epoll\_wait}) allo
+dire con le solite \func{select}, \func{poll} e \func{epoll\_wait}) allo
stesso modo di quelli associati a file o socket, per cui alla fine si potrà
attendere in contemporanea sia l'arrivo del segnale che la disponibilità di
accesso ai dati relativi a questi ultimi.
Come anticipato, essendo questo lo scopo principale della nuova interfaccia,
il file descriptor può essere tenuto sotto osservazione tramite le funzioni
dell'\textit{I/O multiplexing} (vale a dire con le solite \func{select},
-\func{poll} e \funcd{epoll\_wait}), e risulterà accessibile in lettura quando
+\func{poll} e \func{epoll\_wait}), e risulterà accessibile in lettura quando
uno o più dei segnali indicati tramite \param{mask} sarà pendente.
La funzione può essere chiamata più volte dallo stesso processo, consentendo
\textbf{Valore} & \textbf{Significato} \\
\hline
\hline
- \consts{F\_RDLCK} & Richiede un \textit{read lease}.\\
- \consts{F\_WRLCK} & Richiede un \textit{write lease}.\\
- \consts{F\_UNLCK} & Rilascia un \textit{file lease}.\\
+ \constd{F\_RDLCK} & Richiede un \textit{read lease}.\\
+ \constd{F\_WRLCK} & Richiede un \textit{write lease}.\\
+ \constd{F\_UNLCK} & Rilascia un \textit{file lease}.\\
\hline
\end{tabular}
\caption{Costanti per i tre possibili valori dell'argomento \param{arg} di
argomento a tutte le funzioni dell'interfaccia. La sua definizione, come
effettuata in \headfiled{aio.h}, è riportata in
fig.~\ref{fig:file_aiocb}. Nello steso file è definita la macro
-\macro{\_POSIX\_ASYNCHRONOUS\_IO}, che dichiara la disponibilità
+\macrod{\_POSIX\_ASYNCHRONOUS\_IO}, che dichiara la disponibilità
dell'interfaccia per l'I/O asincrono.
\begin{figure}[!htb]
Il campo \var{aio\_reqprio} permette di impostare la priorità delle operazioni
di I/O, in generale perché ciò sia possibile occorre che la piattaforma
supporti questa caratteristica, questo viene indicato dal fatto che le macro
-\macro{\_POSIX\_PRIORITIZED\_IO}, e \macro{\_POSIX\_PRIORITY\_SCHEDULING} sono
-definite. La priorità viene impostata a partire da quella del processo
+\macrod{\_POSIX\_PRIORITIZED\_IO}, e \macrod{\_POSIX\_PRIORITY\_SCHEDULING}
+sono definite. La priorità viene impostata a partire da quella del processo
chiamante (vedi sez.~\ref{sec:proc_priority}), cui viene sottratto il valore
di questo campo. Il campo \var{aio\_lio\_opcode} è usato solo dalla funzione
\func{lio\_listio}, che, come vedremo, permette di eseguire con una sola
% http://webfiveoh.com/content/guides/2012/aug/mon-13th/linux-asynchronous-io-and-libaio.html,
% https://code.google.com/p/kernel/wiki/AIOUserGuide,
% http://bert-hubert.blogspot.de/2012/05/on-linux-asynchronous-file-io.html
+% https://www.fsl.cs.sunysb.edu/~vass/linux-aio.txt
\section{Altre modalità di I/O avanzato}
% TODO trattare MAP_HUGETLB introdotto con il kernel 2.6.32, e modifiche
% introdotte con il 3.8 per le dimensioni variabili delle huge pages
+% TODO trattare MAP_FIXED_NOREPLACE vedi https://lwn.net/Articles/751651/ e
+% https://lwn.net/Articles/741369/
+
L'argomento \param{flags} specifica infine qual è il tipo di oggetto mappato,
le opzioni relative alle modalità con cui è effettuata la mappatura e alle
modalità con cui le modifiche alla memoria mappata vengono condivise o
\label{tab:madvise_advice_values}
\end{table}
+% TODO aggiunta MADV_FREE dal kernel 4.5 (vedi http://lwn.net/Articles/590991/)
+% TODO aggiunta MADV_WIPEONFORK dal kernel 4.14 that causes the affected memory
+% region to appear to be full of zeros in the child process after a fork. It
+% differs from the existing MADV_DONTFORK in that the address range will
+% remain valid in the child (dalla notizia in https://lwn.net/Articles/733256/).
+
\footnotetext{a partire dal kernel 2.6.32 è stato introdotto un meccanismo che
identifica pagine di memoria identiche e le accorpa in una unica pagina
(soggetta al \textit{copy-on-write} per successive modifiche); per evitare
descriptor (si ricordi quanto visto in sez.~\ref{sec:file_adv_func}) con delle
chiamate a \func{lseek}.
+% TODO trattare preadv2() e pwritev2(), introdotte con il kernel 4.6, vedi
+% http://lwn.net/Articles/670231/ ed il flag RWF_HIPRI
\subsection{L'I/O diretto fra file descriptor: \func{sendfile} e
% TODO?? dal 2.6.25 splice ha ottenuto il supporto per la ricezione su rete
+% TODO trattare qui copy_file_range (vedi http://lwn.net/Articles/659523/),
+% introdotta nel kernel 4.5
+
\subsection{Gestione avanzata dell'accesso ai dati dei file}
\label{sec:file_fadvise}