Finita timerfd.
[gapil.git] / fileadv.tex
index f3b6b66673c4c793af0a1a325f4b4ad45ff51888..169586b265059806b835cca6fd7c23ad7f741856 100644 (file)
@@ -807,7 +807,9 @@ comportamento sui file duplicati e nel passaggio attraverso \func{fork} ed
 \func{exec}. Per questo stesso motivo la funzione non è equivalente a
 \func{flock} e può essere usata senza interferenze insieme a quest'ultima.
 
-
+% TODO trattare i POSIX file-private lock introdotti con il 3.15, 
+% vedi http://lwn.net/Articles/586904/ correlato:
+% http://www.samba.org/samba/news/articles/low_point/tale_two_stds_os2.html 
 
 \subsection{Il \textit{mandatory locking}}
 \label{sec:file_mand_locking}
@@ -2447,7 +2449,7 @@ prototipo è:
 \fhead{sys/timerfd.h}
 \fdecl{int timerfd\_create(int clockid, int flags)}
 
-\fdesc{Crea un timer associato ad un file descriptor per la notifica.}
+\fdesc{Crea un timer associato ad un file descriptor di notifica.}
 }
 
 {La funzione ritorna un numero di file descriptor in caso di successo e $-1$
@@ -2474,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]
@@ -2524,7 +2526,7 @@ di \func{timer\_settime} per la nuova interfaccia; questa è
                            const struct itimerspec *new\_value,\\
 \phantom{int timerfd\_settime(}struct itimerspec *old\_value)}
 
-\fdesc{Crea un timer associato ad un file descriptor per la notifica.}
+\fdesc{Arma un timer associato ad un file descriptor di notifica.}
 }
 
 {La funzione ritorna un numero di file descriptor in caso di successo e $-1$
@@ -2550,24 +2552,25 @@ argomenti sono del tutto analoghi a quelli della omologa funzione
 
 I valori ed il significato di questi argomenti sono gli stessi che sono già
 stati illustrati in dettaglio in sez.~\ref{sec:sig_timer_adv} e non staremo a
-ripetere quanto detto in quell'occasione;\footnote{per brevità si ricordi che
-  con \param{new\_value.it\_value} si indica la prima scadenza del timer e
-  con \param{new\_value.it\_interval} la sua periodicità.}  l'unica differenza
+ripetere quanto detto in quell'occasione; per brevità si ricordi che
+con \param{new\_value.it\_value} si indica la prima scadenza del timer e
+con \param{new\_value.it\_interval} la sua periodicità.  L'unica differenza
 riguarda l'argomento \param{flags} che serve sempre ad indicare se il tempo di
 scadenza del timer è da considerarsi relativo o assoluto rispetto al valore
 corrente dell'orologio associato al timer, ma che in questo caso ha come
-valori possibili rispettivamente soltanto $0$ e
-\const{TFD\_TIMER\_ABSTIME}.\footnote{anche questo valore, che è l'analogo di
-  \const{TIMER\_ABSTIME} è l'unico attualmente possibile per \param{flags}.}
+valori possibili rispettivamente soltanto $0$ e \const{TFD\_TIMER\_ABSTIME}
+(l'analogo di \const{TIMER\_ABSTIME}).
 
-L'ultima funzione prevista dalla nuova interfaccia è \funcd{timerfd\_gettime},
-che è l'analoga di \func{timer\_gettime}, il suo prototipo è:
+L'ultima funzione di sistema prevista dalla nuova interfaccia è
+\funcd{timerfd\_gettime}, che è l'analoga di \func{timer\_gettime}, il suo
+prototipo è:
 
 \begin{funcproto}{
 \fhead{sys/timerfd.h}
 \fdecl{int timerfd\_gettime(int fd, struct itimerspec *curr\_value)}
 
-\fdesc{Crea un timer associato ad un file descriptor per la notifica.}
+\fdesc{Legge l'impostazione di un timer associato ad un file descriptor di
+  notifica.} 
 }
 
 {La funzione ritorna un numero di file descriptor in caso di successo e $-1$
@@ -2579,25 +2582,44 @@ che è l'analoga di \func{timer\_gettime}, il suo prototipo è:
     con \func{timerfd\_create}.
   \item[\errcode{EFAULT}] o \param{curr\_value} non è un puntatore valido.
   \end{errlist}
-ed inoltre      nel suo significato generico.
-  
 }  
 \end{funcproto}
 
-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},
-
-
-% 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/
+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 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 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}
@@ -5559,6 +5581,9 @@ livello di kernel.
 % vedi http://lwn.net/Articles/226710/ e http://lwn.net/Articles/240571/
 % http://kernelnewbies.org/Linux_2_6_23
 
+% TODO aggiungere FALLOC_FL_ZERO_RANGE e FALLOC_FL_COLLAPSE_RANGE, inseriti
+% nel kenrel 3.15 (sul secondo vedi http://lwn.net/Articles/589260/)
+
 % TODO non so dove trattarli, ma dal 2.6.39 ci sono i file handle, vedi
 % http://lwn.net/Articles/432757/