Materiale scritto in treno
[gapil.git] / fileadv.tex
index b1cb34858bf049e33861bfe8b8071bb5f9c20aa5..312c36fe1162368cfe548bc08ee417c2d6919741 100644 (file)
@@ -2114,16 +2114,16 @@ timer.\footnote{in realtà per questo sarebbe già sufficiente \func{signalfd}
   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)}
 
@@ -2180,18 +2180,71 @@ tab.~\ref{tab:timerfd_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