Struttura itimerspec, rimasta indietro
[gapil.git] / signal.tex
index 83f35f1503098d93ff4ac8d86046085b31c450a6..6f93285db420917f7da41547b7e784f96e488935 100644 (file)
@@ -2717,7 +2717,7 @@ prevalentemente con i \itindex{thread} \textit{thread}; \funcd{sigwaitinfo} e
   segnale in \param{info}.
   
   \funcdecl{int sigtimedwait(const sigset\_t *set, siginfo\_t *info, const
-    struct timespec *timout)}
+    struct timespec *timeout)}
   
   Analoga a \func{sigwaitinfo}, con un la possibilità di specificare un
   timeout in \param{timeout}.
@@ -2874,10 +2874,10 @@ valore maggiore di 0, e che le ulteriori macro
 \macro{\_POSIX\_THREAD\_CPUTIME} indicano la presenza dei rispettivi orologi
 di tipo \const{CLOCK\_MONOTONIC}, \const{CLOCK\_PROCESS\_CPUTIME\_ID} e
 \const{CLOCK\_PROCESS\_CPUTIME\_ID}.\footnote{tutte queste macro sono definite
-  in \texttt{unistd.h}, che peranto deve essere incluso per poterle
+  in \texttt{unistd.h}, che pertanto deve essere incluso per poterle
   controllarle.} Infine se il kernel ha il supporto per gli \textit{high
   resolution timer} un elenco degli orologi e dei timer può essere ottenuto
-tremite il file \procfile{/proc/timer\_list}.
+tramite il file \procfile{/proc/timer\_list}.
 
 Le due funzioni che ci consentono rispettivamente di modificare o leggere il
 valore per uno degli orologi \textit{real-time} sono \funcd{clock\_settime} e
@@ -2909,7 +2909,7 @@ tab.~\ref{tab:sig_timer_clockid_types} o con il risultato di una chiamata a
 \func{clock\_getcpuclockid} (che tratteremo a breve), il secondo argomento
 invece è sempre il puntatore \param{tp} ad una struttura \struct{timespec}
 (vedi fig.~\ref{fig:sys_timespec_struct}) che deve essere stata
-precedentemente allocata; nel primo caso questa devrà anche essere stata
+precedentemente allocata; nel primo caso questa dovrà anche essere stata
 inizializzata con il valore che si vuole impostare sull'orologio, mentre nel
 secondo verrà restituito al suo interno il valore corrente dello stesso.
 
@@ -2946,7 +2946,7 @@ orologio, la funzione 
 }
 \end{functions}
 
-La funzione richiede come primo argomento l'indicazione dell' orologio di cui
+La funzione richiede come primo argomento l'indicazione dell'orologio di cui
 si vuole conoscere la risoluzione (effettuata allo stesso modo delle due
 precedenti) e questa verrà restituita in una struttura \struct{timespec}
 all'indirizzo puntato dall'argomento \param{res}. 
@@ -3089,7 +3089,7 @@ introduce una struttura di uso generale, \struct{sigevent}, che viene
 utilizzata anche da altre funzioni, come quelle per l'I/O asincrono (vedi
 sez.~\ref{sec:file_asyncronous_io}) o le code di messaggi POSIX (vedi
 sez.~\ref{sec:ipc_posix_mq})) e che serve ad indicare in maniera generica un
-meccanimo di notifica. 
+meccanismo di notifica. 
 
 \begin{figure}[!htb]
   \footnotesize \centering
@@ -3105,11 +3105,11 @@ meccanimo di notifica.
 La struttura \struct{sigevent} (accessibile includendo \texttt{time.h}) è
 riportata in fig.~\ref{fig:struct_sigevent};\footnote{la definizione effettiva
   dipende dall'implementazione, quella mostrata è la versione descritta nella
-  pagina di manule di \func{timer\_create}.} il campo \var{sigev\_notify} è il
+  pagina di manuale di \func{timer\_create}.} il campo \var{sigev\_notify} è il
 più importante essendo quello che indica le modalità della notifica, gli altri
 dipendono dal valore che si è specificato per \var{sigev\_notify}, si sono
 riportati in tab.~\ref{tab:sigevent_sigev_notify}. La scelta del meccanismo di
-nnotifica viene fatta impostando uno dei valori di
+notifica viene fatta impostando uno dei valori di
 tab.~\ref{tab:sigevent_sigev_notify} per \var{sigev\_notify}, e fornendo gli
 eventuali ulteriori argomenti necessari a secondo della scelta
 effettuata. Diventa così possibile indicare l'uso di un segnale o l'esecuzione
@@ -3165,7 +3165,6 @@ utilizzato un valore equivalente all'aver specificato \const{SIGEV\_SIGNAL}
 per \var{sigev\_notify}, \const{SIGALRM} per \var{sigev\_signo} e
 l'identificatore del timer come valore per \var{sigev\_value.sival\_int}.
 
-
 Il terzo argomento deve essere l'indirizzo di una variabile di tipo
 \type{timer\_t} dove sarà scritto l'identificativo associato al timer appena
 creato, da usare in tutte le successive funzioni di gestione. Una volta creato
@@ -3184,7 +3183,7 @@ sia stato impostato, dal limite \const{RLIMIT\_SIGPENDING}
 
 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
+\textsl{armare} o \textsl{disarmare} il timer) con la funzione
 \funcd{timer\_settime}, il cui prototipo è:
 \begin{functions}
   \headdecl{signal.h}
@@ -3195,8 +3194,7 @@ identificatore, si pu
   
   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à 
+  \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{EINVAL}] all'interno di \param{new\_value.value} si è
@@ -3208,11 +3206,13 @@ identificatore, si pu
 }
 \end{functions}
 
-La funzione richiede che si indici la scadenza del timer con
+La funzione richiede che si indichi 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.
+fig.~\ref{fig:struct_itimerspec}; se il puntatore \param{old\_value} è diverso
+da \val{NULL} il valore corrente della scadenza verrà restituito in una
+analoga struttura, ovviamente in entrambi i casi le strutture devono essere
+state allocate.
 
 \begin{figure}[!htb]
   \footnotesize \centering
@@ -3227,7 +3227,7 @@ fig.~\ref{fig:struct_itimerspec}, se \param{old\_value} 
 
 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
+(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è
@@ -3238,11 +3238,54 @@ viene considerato come valore assoluto rispetto al valore dell'orologio a cui
   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, }
+  alla partenza di un orologio di CPU.}
+
+Il campo \var{it\_interval} consente invece di impostare un allarme periodico.
+Se il suo valore è nullo (se cioè sono nulli tutti e due i valori di detta
+struttura \struct{timespec}) l'allarme scatterà una sola volta secondo quando
+indicato con \var{it\_value}, altrimenti il valore specificato verrà preso
+come l'estensione del periodo di ripetizione della generazione dell'allarme.
+
+Se il timer era già stato armato la funzione sovrascrive la precedente
+impostazione, se invece si indica come prima scadenza un tempo già passato,
+l'allarme verrà notificato immediatamente e al contempo verrà incrementato il
+contatore dei superamenti. Questo contatore serve a fornire una indicazione al
+programma che riceve l'allarme su un eventuale numero di scadenze che sono
+passate prima della ricezione della notifica dell'allarme. 
+
+É infatti possibile, qualunque sia il meccanismo di notifica scelto, che
+quest'ultima venga ricevuta dopo che il timer è scaduto più di una
+volta.\footnote{specialmente se si imposta un timer con una ripetizione a
+  frequenza elevata.} Nel caso dell'uso di un segnale infatti il sistema mette
+in coda un solo segnale per timer,\footnote{questo indipendentemente che si
+  tratti di un segnale ordinario o \textit{real-time}; per questi ultimi
+  sarebbe anche possibile inviare un segnale per ogni scadenza, questo però
+  non viene fatto per evitare il rischio, tutt'altro che remoto, di riempire
+  la coda.}  e se il sistema è sotto carico o se il segnale è bloccato, prima
+della sua ricezione può passare un intervallo di tempo sufficientemente lungo
+ad avere scadenze multiple, e lo stesso può accadere anche se si usa un
+\textit{thread}. 
+
+Per questo motivo il gestore del segnale o il \textit{thread} di notifica può
+ottenere una indicazione di quante volte il time è scaduto utilizzando la
+fuzione  \funcd{timer\_getoverrun}, il cui prototipo è:
+\begin{functions}
+  \headdecl{time.h}
+
+  \funcdecl{int timer\_getoverrun(timer\_t timerid)}
+  
+  Ottiene il numero di scadenze di un timer POSIX.
+  
+  \bodydesc{La funzione restituisce il numero di scadenze di un timer (anche 0
+    se non ve ne sono) in caso di successo e $-1$ in caso di errore, nel qual
+    caso \var{errno} assumerà il valore:
+  \begin{errlist}
+  \item[\errcode{EINVAL}] \param{timerid} non indica un timer valido.
+  \end{errlist}
+}
+\end{functions}
+
 
-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
@@ -3326,6 +3369,9 @@ eventi generici) basato direttamente sull'uso di file descriptor.
 % LocalWords:  openat readlinkat renameat symlinkat unlinkat utimensat utimes
 % LocalWords:  LinuxThread NTPL Library clockid evp timerid sigev notify high
 % LocalWords:  resolution CONFIG RES patch REALTIME MONOTONIC RAW NTP CPUTIME
+% LocalWords:  tick calendar The Epoch list getcpuclockid capability CAP getres
+% LocalWords:  ENOSYS pthread ENOENT NULL attribute itimerspec new old ABSTIME
+% LocalWords:  epoch multiplexing
 
 
 %%% Local Variables: