X-Git-Url: https://gapil.gnulinux.it/gitweb/?a=blobdiff_plain;f=fileadv.tex;h=2b303c993bf77374fba36d195c72c743993acc19;hb=310c47ae91dae16a74a592e178e5c6d4df2e76be;hp=48766b10a8116ca759c88440f88f4dccf14d1245;hpb=58f0417a8f87b0e589b6eaceca656a3466774487;p=gapil.git diff --git a/fileadv.tex b/fileadv.tex index 48766b1..2b303c9 100644 --- a/fileadv.tex +++ b/fileadv.tex @@ -2449,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$ @@ -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] @@ -2526,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$ @@ -2552,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$ @@ -2581,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 +\errval{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}