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 è:
+Le funzioni di questa interfaccia ricalcano da vicino la struttura delle
+analoghe versioni ordinarie introdotte con lo standard POSIX.1-2001, che
+abbiamo già 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, quella 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)}
\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
+In caso di successo la funzione restituisce un file descriptor sul quale
+verranno notificate le 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},\footnote{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}; questa
+ultima caratteristica comporta però che anche il figlio può utilizzare i dati
+di un timer creato nel padre, a differenza di quanto avviene invece con i
+timer impostati con le funzioni ordinarie.\footnote{si ricordi infatti che,
+ come illustrato in sez.~\ref{sec:proc_fork}, allarmi, timer e segnali
+ pendenti nel padre vengono cancellati per il figlio dopo una \func{fork}.}
+
+Una volta creato il timer con \funcd{timerfd\_create} per poterlo utilizzare
+occorre \textsl{armarlo} impostandone un tempo di scadenza ed una eventuale
+periodicità di ripetizione, per farlo su usa la funzione omologa di
+\func{timer\_settime} per la nuova interfaccia; questa è
+\func{timerfd\_settime}; il suo prototipo è:
+\begin{prototype}{sys/timerfd.h}
+ {int timerfd\_settime(int fd, int flags,
+ const struct itimerspec *new_value,
+ struct itimerspec *old_value)}
+
+ Crea un timer associato ad un file descriptor per la notifica.
+
+ \bodydesc{La funzione restituisce un numero di file descriptor in caso di
+ successo o $-1$ in caso di errore, nel qual caso \var{errno} assumerà uno
+ dei valori:
+ \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
+ precedenti il 2.6.27.
+ \item[\errcode{ENOMEM}] non c'è memoria sufficiente per creare un nuovo file
+ descriptor di \func{signalfd}.
+ \item[\errcode{ENODEV}] il kernel non può montare internamente il
+ dispositivo per la gestione anonima degli inode associati al file
+ descriptor.
+ \end{errlist}
+ ed inoltre \errval{EMFILE} e \errval{ENFILE}.
+}
+\end{prototype}
+
+
+
+
+.\footnote{si otterranno in entrambi i casi gli stessi
+ risultati, il file descriptor risulterà pronto in lettura e in entrambi i
+ processi si potranno leggere il numero di scadenze.}
+
+
+
+
+Questo infatti diverrà pronto in
+lettura per tutte le varie funzioni dell'I/O multiplexing in presenza di una o
+più scadenze del timer ad esso associato.
+
+
+Inoltre sarà possibile ottenere il
+numero di volte che il timer è scaduto dalla ultima impostazione
+
+che può essere
+usato per leggere le notifiche delle scadenze dei timer. Queste possono essere
+ottenute leggendo in maniera ordinaria il file descriptor con una \func{read},
-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