X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=fileadv.tex;h=312c36fe1162368cfe548bc08ee417c2d6919741;hp=2a32a3ebc2fed94c6aa55bd0e4331dab2129782f;hb=986894c4d6a1bce56a1e24893e9f4322782fcd4e;hpb=193d612d40c5f81f5559ea6e11e70f6b6e51fb39 diff --git a/fileadv.tex b/fileadv.tex index 2a32a3e..312c36f 100644 --- a/fileadv.tex +++ b/fileadv.tex @@ -2111,12 +2111,19 @@ utilizzare le funzioni dell'\textit{I/O multiplexing} per attendere allo stesso tempo la disponibilità di dati o la ricezione scadenza di un timer.\footnote{in realtà per questo sarebbe già sufficiente \func{signalfd} per ricevere i segnali associati ai timer, ma la nuova interfaccia - semplifica notevolmente la gestione e diminuisce l'\textit{overhead}.} - -Le funzioni di questa interfaccia riprendono da vicino quelle introdotte da -POSIX.1-2001 illustrate sez.~\ref{sec:sig_timer_adv}. La prima funzione, che -consente di creare un \textit{timer} è \funcd{timerfd\_create}, il cui -prototipo è: + 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 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)} @@ -2128,7 +2135,7 @@ prototipo è: \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 + 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}. @@ -2140,10 +2147,104 @@ prototipo è: } \end{prototype} -La funzione prende come primo argomento il tipo di orologio a cui il timer -deve fare riferimento, il cui significato è già stato illustrato in -tab.~\ref{tab:sig_timer_clockid_types}, ma i soli valori validi sono -\const{CLOCK\_REALTIME} e \const{CLOCK\_MONOTONIC}. +La funzione prende come primo argomento un intero che indica il tipo di +orologio a cui il timer deve fare riferimento, i valori sono gli stessi delle +funzioni dello standard POSIX-1.2001 già illustrati in +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 +tab.~\ref{tab:timerfd_flags}. + +\begin{table}[htb] + \centering + \footnotesize + \begin{tabular}[c]{|l|p{8cm}|} + \hline + \textbf{Valore} & \textbf{Significato} \\ + \hline + \hline + \const{TFD\_NONBLOCK}& imposta sul file descriptor il flag di + \const{O\_NONBLOCK} per renderlo non bloccante.\\ + \const{TFD\_CLOEXEC}& imposta il flag di \const{O\_CLOEXEC} per la + chiusura automatica del file descriptor nella + esecuzione di \func{exec}.\\ + \hline + \end{tabular} + \caption{Valori dell'argomento \param{flags} per la funzione + \func{timerfd\_create} che consentono di impostare i flag del file + descriptor.} + \label{tab:timerfd_flags} +\end{table} + +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}, + + % TODO trattare qui eventfd, timerfd introdotte con il 2.6.22