From 9d960c1a04b4eb728392913cc8acb2e07f51ea63 Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Mon, 28 Apr 2014 14:28:14 +0000 Subject: [PATCH] Finita timerfd. --- fileadv.tex | 57 +++++++++++++++++++++++++++++------------------------ 1 file changed, 31 insertions(+), 26 deletions(-) diff --git a/fileadv.tex b/fileadv.tex index e37ae0e..169586b 100644 --- a/fileadv.tex +++ b/fileadv.tex @@ -2476,9 +2476,9 @@ 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 +restituito,\footnote{il flag è 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] @@ -2588,33 +2588,38 @@ prototipo è: La funzione consente di rileggere le impostazioni del timer associato al file descriptor \param{fd} nella struttura \struct{itimerspec} puntata da \param{curr\_value}. Il campo \var{it\_value} riporta il tempo rimanente -alla prossima scadenza, che viene sempre espresso in forma relativa -(indipendentemente dal fatto che si sia specificato -\const{TFD\_TIMER\_ABSTIME} quando lo si è armato). Un valore nullo (di -entrambi i campi di \var{it\_value}) indica che il timer non è stato ancora -armato. Il campo \var{it\_interval} riporta la durata dell'intervallo di -ripetizione del timer, ed un valore nulle (di entrambi i campi) indica che il -timer è stato impostato per scadere una sola volta. +alla prossima scadenza del timer, che viene sempre espresso in forma relativa, +anche se lo si è armato specificando \const{TFD\_TIMER\_ABSTIME}. Un valore +nullo (di entrambi i campi di \var{it\_value}) indica invece che il timer non +è stato ancora armato. Il campo \var{it\_interval} riporta la durata +dell'intervallo di ripetizione del timer, ed un valore nullo (di entrambi i +campi) indica che il timer è stato impostato per scadere una sola volta. Il timer creato con \func{timerfd\_create} notificherà la sua scadenza rendendo pronto per la lettura il file descriptor ad esso associato, che pertanto potrà essere messo sotto controllo con una qualunque delle varie -funzioni dell'I/O multiplexing. Esso infatti risulterà pronto soltanto in -presenza di una o più scadenze del timer cui è 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}, - -Una volta che - - -% TODO trattare qui eventfd, timerfd introdotte con il 2.6.22 -% timerfd è stata tolta nel 2.6.23 e rifatta per bene nel 2.6.25 -% vedi: http://lwn.net/Articles/233462/ -% http://lwn.net/Articles/245533/ -% http://lwn.net/Articles/267331/ +funzioni dell'I/O multiplexing viste in precedenza. Una volta che il file +descriptor risulta pronto sarà possibile leggere il numero di volte che il +timer è scaduto con una ordinaria \func{read}. + +La funzione legge il valore in un dato di tipo \type{uint64\_t}, e necessita +pertanto che le si passi un buffer di almeno 8 byte, fallendo con +\errvl{EINVAL} in caso contrario, in sostanza la lettura deve essere +effettuata con una istruzione del tipo: +\includecodesnip{listati/readtimerfd.c} + +Il valore viene restituito da \func{read} seguendo l'ordinamento dei bit +(\textit{big-endian} o \textit{little-endian}) nativo della macchina in uso, +ed indica il numero di volte che il timer è scaduto dall'ultima lettura +eseguita con successo, o, se lo si legge per la prima volta, da quando lo si è +impostato con \func{timerfd\_settime}. Se il timer non è scaduto la funzione +si blocca fino alla prima scadenza, a meno di non aver creato il file +descriptor in modalità non bloccante con \const{TFD\_NONBLOCK} o aver +impostato la stessa con \func{fcntl}, nel qual caso fallisce con l'errore di +\errval{EAGAIN}. + + +% TODO trattare qui eventfd introdotte con il 2.6.22 \section{L'accesso \textsl{asincrono} ai file} -- 2.30.2