stato consegnato. In questo caso, per il comportamento dei segnali descritto
in sez.~\ref{sec:sig_sigchld}, un solo segnale sarà consegnato. Per questo
oggi l'uso di questa funzione è deprecato a favore degli
-\index{High~Resolution~Timer~(HRT)} \textit{high-resolution timer} e della
+\itindex{High~Resolution~Timer~(HRT)} \textit{high-resolution timer} e della
cosiddetta \itindex{POSIX~Timer~API} \textit{POSIX Timer API}, che tratteremo
in sez.~\ref{sec:sig_timer_adv}.
% TODO: indicizzare i termini \itindex{POSIX~Timer~API} e HRT
-
Sia le funzioni per la gestione dei tempi viste in
sez.~\ref{sec:sys_cpu_times} che quelle per la gestione dei timer di
sez.~\ref{sec:sig_alarm_abort} sono state a lungo limitate dalla risoluzione
massima dei tempi dell'orologio interno del kernel, che era quella ottenibile
dal timer di sistema che governa lo \textit{scheduler}, e quindi limitate
dalla frequenza dello stesso che si ricordi, come già illustrato in
-sez.~\ref{sec:proc_hierarchy}, è data dal valore della costante \texttt{HZ}. I
-contatori usati per il calcolo dei tempi infatti erano basati sul numero di
+sez.~\ref{sec:proc_hierarchy}, è data dal valore della costante \texttt{HZ}.
+
+I contatori usati per il calcolo dei tempi infatti erano basati sul numero di
\itindex{jiffies} \textit{jiffies} che vengono incrementati ad ogni
\textit{clock tick} del timer di sistema, il che comportava anche, come
accennato in sez.~\ref{sec:sig_alarm_abort} per \func{setitimer}, problemi per
associati al \textit{process time} almeno fino a quando, con il kernel 2.6.16,
non è stato rimosso il limite di un valore a 32 bit per i \textit{jiffies}.
+\itindbeg{POSIX~Timer~API}
+
Nelle architetture moderne però tutti i computer sono dotati di temporizzatori
hardware che possono supportare risoluzioni molto elevate, ed in maniera del
tutto indipendente dalla frequenza scelta per il timer di sistema che governa
lo \textit{scheduler}, normalmente si possono ottenere precisioni fino al
-microsecondo, andando molto oltre in caso di hardware dedicato. Per questo lo
-standard POSIX.1-2001 ha previsto una serie di nuove funzioni relative a
-quelli che vengono chiamati ``\textsl{orologi} \textit{real-time}'', in grado
-di supportare risoluzioni fino al nanosecondo. Inoltre le CPU più moderne sono
-dotate a loro volta di contatori ad alta definizione che consentono una grande
-accuratezza nella misura del tempo da esse dedicato all'esecuzione di un
-processo.
+microsecondo, andando molto oltre in caso di hardware dedicato.
+
+Per questo lo standard POSIX.1-2001 ha previsto una serie di nuove funzioni
+relative a quelli che vengono chiamati ``\textsl{orologi}
+\textit{real-time}'', in grado di supportare risoluzioni fino al
+nanosecondo. Inoltre le CPU più moderne sono dotate a loro volta di contatori
+ad alta definizione che consentono una grande accuratezza nella misura del
+tempo da esse dedicato all'esecuzione di un processo.
Per usare queste funzionalità ed ottenere risoluzioni temporali più accurate,
occorre però un opportuno supporto da parte del kernel, ed i cosiddetti
\itindex{High~Resolution~Timer~(HRT)} \textit{high resolution timer} che
consentono di fare ciò sono stati introdotti nel kernel ufficiale solo a
-partire dalla versione 2.6.21.\footnote{deve essere stata abilitata l'opzione
- di compilazione \texttt{CONFIG\_HIGH\_RES\_TIMERS}, erano però disponibili
- anche in precedenza come patch facenti parte dello sviluppo delle estensioni
- \textit{real-time} del kernel, per cui alcune distribuzioni possono avere
- questo supporto anche con versioni precedenti del kernel.} Le funzioni
-definite dallo standard POSIX per gestire orologi ad alta definizione però
-erano già presenti, essendo stata introdotte insieme ad altre funzioni per il
-supporto delle estensioni \textit{real-time} con il rilascio del kernel 2.6,
-ma la risoluzione effettiva era nominale.
+partire dalla versione 2.6.21.\footnote{per il supporto deve essere stata
+ abilitata l'opzione di compilazione \texttt{CONFIG\_HIGH\_RES\_TIMERS}, il
+ supporto era però disponibile anche in precedenza nei patch facenti parte
+ dello sviluppo delle estensioni \textit{real-time} del kernel, per cui
+ alcune distribuzioni possono averlo anche con versioni precedenti del
+ kernel.} Le funzioni definite dallo standard POSIX per gestire orologi ad
+alta definizione però erano già presenti, essendo stata introdotte insieme ad
+altre funzioni per il supporto delle estensioni \textit{real-time} con il
+rilascio del kernel 2.6, ma la risoluzione effettiva era nominale.
A tutte le implementazioni che si rifanno a queste estensioni è richiesto di
disporre di una versione \textit{real-time} almeno per l'orologio generale di
sistema, quello che mantiene il \textit{calendar time} (vedi
sez.~\ref{sec:sys_time_base}), che in questa forma deve indicare il numero di
secondi e nanosecondi passati a partire dal primo gennaio 1970 (\textit{The
- Epoch}).\footnote{si ricordi che l'orologio ordinario usato dal
- \textit{calendar time} riporta solo un numero di secondi, e che la
- risoluzione effettiva normalmente non raggiunge il nanosecondo (a meno di
- hardware specializzato).} Oltre all'orologio generale di sistema possono
-essere presenti altri tipi di orologi \textit{real-time}, ciascuno dei quali
-viene identificato da un opportuno valore di una variabile di tipo
+ Epoch}). Si ricordi infatti che l'orologio ordinario usato dal
+\textit{calendar time} riporta solo un numero di secondi, e che la risoluzione
+effettiva normalmente non raggiunge il nanosecondo (a meno di hardware
+specializzato). Oltre all'orologio generale di sistema possono essere
+presenti altri tipi di orologi \textit{real-time}, ciascuno dei quali viene
+identificato da un opportuno valore di una variabile di tipo
\type{clockid\_t}; un elenco di quelli disponibili su Linux è riportato in
tab.~\ref{tab:sig_timer_clockid_types}.
\const{CLOCK\_MONOTONIC\_RAW}&Simile al precedente, ma non subisce gli
aggiustamenti dovuti all'uso di NTP (viene
usato per fare riferimento ad una fonte
- hardware).\footnotemark\\
+ hardware). Questo orologio è specifico di
+ Linux, ed è disponibile a partire dal kernel
+ 2.6.28.\\
\const{CLOCK\_PROCESS\_CPUTIME\_ID}& contatore del tempo di CPU usato
da un processo (il \textit{process time} di
sez.~\ref{sec:sys_cpu_times}, nel totale di
(\textit{user time} e \textit{system time})
usato da un singolo \itindex{thread}
\textit{thread}.\\
+ \const{CLOCK\_BOOTTIME} & Identico a \const{CLOCK\_MONOTONIC} ma tiene
+ conto anche del tempo durante il quale il
+ sistema è stato sospeso (nel caso di
+ sospenzione in RAM o \textsl{ibernazione} su
+ disco. Questo orologio è specifico di Linux,
+ ed è disponibile a partire dal kernel
+ 2.6.39.\\
+ \const{CLOCK\_REALTIME\_ALARM}&Identico a \const{CLOCK\_REALTIME}, ma se
+ usato per un timer il sistema sarà riattivato
+ anche se è in sospensione. Questo orologio è
+ specifico di Linux, ed è disponibile a
+ partire dal kernel 3.0.\\
+ \const{CLOCK\_BOOTTIME\_ALARM}&Identico a \const{CLOCK\_BOOTTIME}, ma se
+ usato per un timer il sistema sarà riattivato
+ anche se è in sospensione. Questo orologio è
+ specifico di Linux, ed è disponibile a
+ partire dal kernel 3.0.\\
% \const{} & .\\
\hline
\end{tabular}
\label{tab:sig_timer_clockid_types}
\end{table}
-\footnotetext{specifico di Linux, introdotto a partire dal kernel 2.6.28, non
- previsto da POSIX e non presente in altri sistemi unix-like.}
% TODO: aggiungere le estensioni introdotte con il 2.6.38, verificandone il
% funzionamento, vedi http://lwn.net/Articles/429595/
-% TODO: dal 2.6.39 anche CLOCK_BOOTTIME_ALARM e CLOCK_BOOTTIME, vedi
-% http://lwn.net/Articles/429925/
+% TODO: dal 2.6.39 anche CLOCK_BOOTTIME_ALARM e CLOCK_BOOTTIME
% TODO: dal 3.0 anche i cosiddetti Posix Alarm Timers, con
% CLOCK_REALTIME_ALARM vedi http://lwn.net/Articles/429925/
di \texttt{199309L} (vedi sez.~\ref{sec:intro_gcc_glibc_std}), inoltre i
programmi che le usano devono essere collegati con la libreria delle
estensioni \textit{real-time} usando esplicitamente l'opzione
-\texttt{-lrt}. Si tenga presente inoltre che la disponibilità di queste
-funzionalità avanzate può essere controllato dalla definizione della macro
-\macro{\_POSIX\_TIMERS} ad un valore maggiore di 0, e che le ulteriori macro
+\texttt{-lrt}.
+
+Si tenga presente inoltre che la disponibilità di queste funzionalità avanzate
+può essere controllato dalla definizione della macro \macro{\_POSIX\_TIMERS}
+ad un valore maggiore di 0, e che le ulteriori macro
\macro{\_POSIX\_MONOTONIC\_CLOCK}, \macro{\_POSIX\_CPUTIME} e
\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 \headfile{unistd.h}, che pertanto deve essere incluso per poterle
- controllarle.} Infine se il kernel ha il supporto per gli \textit{high
+\const{CLOCK\_PROCESS\_CPUTIME\_ID}; tutte queste macro sono definite in
+\headfile{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
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
\funcd{clock\_gettime}; i rispettivi prototipi sono:
-\begin{functions}
- \headdecl{time.h}
- \funcdecl{int clock\_settime(clockid\_t clockid, const struct timespec *tp)}
- \funcdecl{int clock\_gettime(clockid\_t clockid, struct timespec *tp)}
-
- Imposta o legge un orologio \textit{real-time}.
-
- \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{funcproto}{
+\fhead{time.h}
+\fdecl{int clock\_settime(clockid\_t clockid, const struct timespec *tp)}
+\fdesc{Imposta un orologio \textit{real-time}.}
+\fdecl{int clock\_gettime(clockid\_t clockid, struct timespec *tp)}
+\fdesc{Legge un orologio \textit{real-time}.}
+}
+
+{Le funzioni ritornano $0$ in caso di successo e $-1$ per un errore, nel qual
+ caso \var{errno} assumerà uno dei valori:
\begin{errlist}
\item[\errcode{EFAULT}] l'indirizzo \param{tp} non è valido.
\item[\errcode{EINVAL}] il valore specificato per \param{clockid} non è
indicato (solo per \func{clock\_settime}).
\end{errlist}
}
-\end{functions}
+\end{funcproto}
Entrambe le funzioni richiedono che si specifichi come primo argomento il tipo
di orologio su cui si vuole operare con uno dei valori di
un timer venga cancellato prima della ricezione del segnale pendente per la
notifica di una scadenza, il comportamento del sistema è indefinito.
+\itindend{POSIX~Timer~API}
+
+
+
\subsection{Ulteriori funzioni di gestione}
\label{sec:sig_specific_features}