X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=fileadv.tex;h=b1cb34858bf049e33861bfe8b8071bb5f9c20aa5;hp=2a32a3ebc2fed94c6aa55bd0e4331dab2129782f;hb=bd8c369514b9f49a58fe22c095f5313a521e6ee2;hpb=193d612d40c5f81f5559ea6e11e70f6b6e51fb39 diff --git a/fileadv.tex b/fileadv.tex index 2a32a3e..b1cb348 100644 --- a/fileadv.tex +++ b/fileadv.tex @@ -2111,12 +2111,19 @@ utilizzare le funzioni dell'\textit{I/O multiplexing} per attendere allo stesso tempo la disponibilità di dati o la ricezione scadenza di un timer.\footnote{in realtà per questo sarebbe già sufficiente \func{signalfd} per ricevere i segnali associati ai timer, ma la nuova interfaccia - semplifica notevolmente la gestione e diminuisce l'\textit{overhead}.} - -Le funzioni di questa interfaccia riprendono da vicino quelle introdotte da -POSIX.1-2001 illustrate sez.~\ref{sec:sig_timer_adv}. La prima funzione, che -consente di creare un \textit{timer} è \funcd{timerfd\_create}, il cui -prototipo è: + semplifica notevolmente la gestione e consente di fare tutto con una sola + \textit{system call}.} + +Le funzioni di questa interfaccia ricalcano da vicino la struttura di quelle +introdotte da POSIX.1-2001, che abbiamo illustrato in +sez.~\ref{sec:sig_timer_adv}.\footnote{questa interfaccia è stata introdotta + in forma considerata difettosa con il kernel 2.6.22, per cui è stata + immediatamente tolta nel successivo 2.6.23 e reintrodotta in una forma + considerata adeguata nel kernel 2.6.25, il supporto nelle \acr{glibc} è + stato introdotto a partire dalla versione 2.8.6, la versione del kernel + 2.6.22 non è supportata e non deve essere usata.} La prima funzione +prevista, che consente di creare un \textit{timer}, è \funcd{timerfd\_create}, +il cui prototipo è: \begin{prototype}{sys/timerfd.h} {int timerfd\_create(int clockid, int flags)} @@ -2128,7 +2135,7 @@ prototipo è: \begin{errlist} \item[\errcode{EINVAL}] l'argomento \param{clockid} non è \const{CLOCK\_MONOTONIC} o \const{CLOCK\_REALTIME}, o - l'argomento \param{flag} non è valido o diverso da zero per kernel + l'argomento \param{flag} non è valido, o è diverso da zero per kernel precedenti il 2.6.27. \item[\errcode{ENOMEM}] non c'è memoria sufficiente per creare un nuovo file descriptor di \func{signalfd}. @@ -2140,10 +2147,51 @@ prototipo è: } \end{prototype} -La funzione prende come primo argomento il tipo di orologio a cui il timer -deve fare riferimento, il cui significato è già stato illustrato in -tab.~\ref{tab:sig_timer_clockid_types}, ma i soli valori validi sono -\const{CLOCK\_REALTIME} e \const{CLOCK\_MONOTONIC}. +La funzione prende come primo argomento un intero che indica il tipo di +orologio a cui il timer deve fare riferimento, i valori sono gli stessi delle +funzioni dello standard POSIX-1.2001 già illustrati in +tab.~\ref{tab:sig_timer_clockid_types}, ma al momento i soli utilizzabili sono +\const{CLOCK\_REALTIME} e \const{CLOCK\_MONOTONIC}. L'argomento \param{flags}, +come l'analogo di \func{signalfd}, consente di impostare i flag per l'I/O non +bloccante ed il \textit{close-on-exec} sul file descriptor +restituito,\footnote{esso è stato introdotto a partire dal kernel 2.6.27, per + le versioni precedenti deve essere passato un valore nullo.} e deve essere +specificato come una maschera binaria delle costanti riportate in +tab.~\ref{tab:timerfd_flags}. + +\begin{table}[htb] + \centering + \footnotesize + \begin{tabular}[c]{|l|p{8cm}|} + \hline + \textbf{Valore} & \textbf{Significato} \\ + \hline + \hline + \const{TFD\_NONBLOCK}& imposta sul file descriptor il flag di + \const{O\_NONBLOCK} per renderlo non bloccante.\\ + \const{TFD\_CLOEXEC}& imposta il flag di \const{O\_CLOEXEC} per la + chiusura automatica del file descriptor nella + esecuzione di \func{exec}.\\ + \hline + \end{tabular} + \caption{Valori dell'argomento \param{flags} per la funzione + \func{timerfd\_create} che consentono di impostare i flag del file + descriptor.} + \label{tab:timerfd_flags} +\end{table} + +In caso di successo la funzione restituisce un file descriptor che può essere +usato per leggere le notifiche delle scadenze dei timer. Come per quelli +restituiti da \func{signalfd} anche questo file descriptor segue la semantica +dei sistemi unix-like, in particolare resta aperto attraverso una \func{exec} +(a meno che non si sia impostato il flag di \textit{close-on exex} con +\const{TFD\_CLOEXEC}) e viene duplicato attraverso una \func{fork}, mantenendo +il riferimento allo stesso \textit{timer}, così che anche il processo figlio + + +per cui +anche un processo figlio potrà ricevere informazioni sulla scadenza di un +timer attraverso % TODO trattare qui eventfd, timerfd introdotte con il 2.6.22