Poche correzioni sui timer
[gapil.git] / signal.tex
index 2a9b2535e94e14b1dfeac151014083b14715e271..8e2137aa9622db5bbacdc582333014dc9c1300de 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}. 
@@ -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.
@@ -3090,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
@@ -3098,19 +3097,19 @@ 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}
 
 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
@@ -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
@@ -3176,7 +3175,88 @@ che il timer non viene cancellato.
 Si tenga presente che eventuali POSIX timer creati da un processo non vengono
 ereditati dai processi figli creati con \func{fork} e che vengono cancellati
 nella esecuzione di un programma diverso attraverso una delle funzioni
-\func{exec}.
+\func{exec}. Si tenga presente inoltre che il kernel prealloca l'uso di un
+segnale \textit{real-time} per ciascun timer che viene creato con
+\func{timer\_create}; dato che ciascuno di essi richiede un posto nella coda
+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 \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 funzione
+\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 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 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
+  \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.}
+
+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. 
+
+
 
 
 % TODO trattare i Posix timer, e le fuzioni:
@@ -3261,6 +3341,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: