From a16489a1d394096d615743b3be598c47b994ef52 Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Fri, 18 Jun 2010 13:35:15 +0000 Subject: [PATCH] Ancora materiale sui timer POSIX (grazie alle code agli uffici pubblici) --- signal.tex | 76 +++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 67 insertions(+), 9 deletions(-) diff --git a/signal.tex b/signal.tex index 0c2b7e0..83f35f1 100644 --- a/signal.tex +++ b/signal.tex @@ -3062,9 +3062,8 @@ avviati) tramite la funzione \funcd{timer\_create}, il cui prototipo Crea un nuovo timer Posix. - \bodydesc{La funzione restituisce 0 in caso di successo e $-1$ - in caso di errore, nel qual caso \var{errno} assumerà uno dei valori già - visti per \func{sigwait}, ai quali si aggiunge, per \func{sigtimedwait}: + \bodydesc{La funzione restituisce 0 in caso di successo e $-1$ in caso di + errore, nel qual caso \var{errno} assumerà uno dei seguenti valori: \begin{errlist} \item[\errcode{EAGAIN}] fallimento nel tentativo di allocare le strutture dei timer. @@ -3098,8 +3097,8 @@ meccanimo di notifica. \includestruct{listati/sigevent.h} \end{minipage} \normalsize - \caption{La struttura \structd{sigevent}, usata per specificare le modalità - di notifica degli eventi relativi alle operazioni di I/O asincrono.} + \caption{La struttura \structd{sigevent}, usata per specificare in maniera + generica diverse modalità di notifica degli eventi.} \label{fig:struct_sigevent} \end{figure} @@ -3139,7 +3138,7 @@ effettuata. Diventa cos \itindex{thread} \textit{thread} che esegue la funzione di notifica specificata da \var{sigev\_notify\_function} con argomento - \var{sigev\_value}, se diverso da \const{NULL} il + \var{sigev\_value}, se diverso da \val{NULL} il \textit{thread} viene creato con gli attributi specificati da \var{sigev\_notify\_attribute}.\\ \const{SIGEV\_THREAD\_ID}& Invia la notifica come segnale (con le stesse @@ -3160,7 +3159,7 @@ effettuata. Diventa cos Nel caso di \func{timer\_create} occorrerà passare alla funzione come secondo argomento l'indirizzo di una di queste strutture per indicare le modalità con cui si vuole essere notificati della scadenza del timer, se non si specifica -nulla (passando un valore \const{NULL}) verrà inviato il segnale +nulla (passando un valore \val{NULL}) verrà inviato il segnale \const{SIGALRM} al processo corrente, o per essere più precisi verrà utilizzato un valore equivalente all'aver specificato \const{SIGEV\_SIGNAL} per \var{sigev\_notify}, \const{SIGALRM} per \var{sigev\_signo} e @@ -3183,8 +3182,67 @@ dei segnali \textit{real-time}, il numero massimo di timer utilizzabili da un processo è limitato dalle dimensioni di detta coda, ed anche, qualora questo sia stato impostato, dal limite \const{RLIMIT\_SIGPENDING} -Una volta creato il timer si può attivare o disattivare un allarme con la -fuzione \funcd{timer\_settime}, +Una volta creato il timer \func{timer\_create} ed ottenuto il relativo +identificatore, si può attivare o disattivare un allarme (in gergo +\textsl{armare} o \textsl{disarmare} il timer) con la fuzione +\funcd{timer\_settime}, il cui prototipo è: +\begin{functions} + \headdecl{signal.h} + \headdecl{time.h} + + \funcdecl{int timer\_settime(timer\_t timerid, int flags, const struct + itimerspec *new\_value, struct itimerspec *old\_value)} + + Arma o disarma il timer POSIX. + + \bodydesc{La funzione restituisce 0 in caso di successo e $-1$ + in caso di errore, nel qual caso \var{errno} assumerà + errore, nel qual caso \var{errno} assumerà uno dei seguenti valori: + \begin{errlist} + \item[\errcode{EINVAL}] all'interno di \param{new\_value.value} si è + specificato un tempo negativo o un numero di nanosecondi maggiore di + 999999999. + \item[\errcode{EFAULT}] si è specificato un indirizzo non valido + per \param{new\_value} o \param{old\_value}. + \end{errlist} +} +\end{functions} + +La funzione richiede che si indici la scadenza del timer con +l'argomento \param{new\_value}, che deve essere specificato come puntatore ad +una struttura di tipo \struct{itimerspec}, la cui definizione è riportata in +fig.~\ref{fig:struct_itimerspec}, se \param{old\_value} è diverso da +\val{NULL} il precedente valore verrà restituito in questa struttura. + +\begin{figure}[!htb] + \footnotesize \centering + \begin{minipage}[c]{15cm} + \includestruct{listati/itimerspec.h} + \end{minipage} + \normalsize + \caption{La struttura \structd{itimerspec}, usata per specificare la + scadenza di un allarme.} + \label{fig:struct_itimerspec} +\end{figure} + +Ciascuno dei due campi di \struct{itimerspec} indica un tempo, da specificare +con una precisione fino al nanosecondo tramite una struttura \struct{timespec} +(la cui definizione è riportata fig.~\ref{fig:sys_timespec_struct})). Il campo +\var{it\_value} indica la prima scadenza dell'allarme. Di default, quando il +valore di \param{flag} è nullo, questo valore viene considerato come un +intervallo relativo al tempo corrente,\footnote{il primo allarme scatterà cioè + dopo il numero di secondi e nanosecondi indicati da questo campo.} se invece +si usa per \param{flag} il valore \const{TIMER\_ABSTIME}, \var{it\_value} +viene considerato come valore assoluto rispetto al valore dell'orologio a cui +è associato il timer.\footnote{quindi a seconda dell'orologio che si usa, si + può indicare sia un tempo assoluto, se si opera rispetto all'orologio di + sistema (nel qual caso il valore deve essere in secondi e nanosecondi dalla + \textit{epoch}) o come un certo numero di secondi o nanosecondi rispetto + alla partenza di un orologio di CPU, } + +Se il valore di \var{it\_interval} è nullo (se cioè sono nulli tutti e due i +valori di detta struttura \struct{timespec}) l'allarme scatterà + % TODO trattare i Posix timer, e le fuzioni: % timer_getoverrun, timer_gettime, timer_settime, timer_create, timer_delete -- 2.30.2