X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=fileadv.tex;h=312c36fe1162368cfe548bc08ee417c2d6919741;hp=b1cb34858bf049e33861bfe8b8071bb5f9c20aa5;hb=986894c4d6a1bce56a1e24893e9f4322782fcd4e;hpb=bd8c369514b9f49a58fe22c095f5313a521e6ee2 diff --git a/fileadv.tex b/fileadv.tex index b1cb348..312c36f 100644 --- a/fileadv.tex +++ b/fileadv.tex @@ -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