siginfo_t {
- int si_signo; /* Signal number */
- int si_errno; /* An errno value */
- int si_code; /* Signal code */
- pid_t si_pid; /* Sending process ID */
- uid_t si_uid; /* Real user ID of sending process */
- int si_status; /* Exit value or signal */
- clock_t si_utime; /* User time consumed */
- clock_t si_stime; /* System time consumed */
- sigval_t si_value; /* Signal value */
- int si_int; /* POSIX.1b signal */
- void * si_ptr; /* POSIX.1b signal */
- void * si_addr; /* Memory location which caused fault */
- int si_band; /* Band event */
- int si_fd; /* File descriptor */
+ int si_signo; /* Signal number */
+ int si_errno; /* An errno value */
+ int si_code; /* Signal code */
+ int si_trapno; /* Trap number that caused hardware-generated
+ signal (unused on most architectures) */
+ pid_t si_pid; /* Sending process ID */
+ uid_t si_uid; /* Real user ID of sending process */
+ int si_status; /* Exit value or signal */
+ clock_t si_utime; /* User time consumed */
+ clock_t si_stime; /* System time consumed */
+ sigval_t si_value; /* Signal value */
+ int si_int; /* POSIX.1b signal */
+ void * si_ptr; /* POSIX.1b signal */
+ int si_overrun; /* Timer overrun count; POSIX.1b timers */
+ int si_timerid; /* Timer ID; POSIX.1b timers */
+ void * si_addr; /* Memory location which caused fault */
+ long si_band; /* Band event (was int before glibc 2.3.2) */
+ int si_fd; /* File descriptor */
}
\var{si\_addr} con l'indirizzo in cui è avvenuto l'errore, \const{SIGIO} (vedi
sez.~\ref{sec:file_asyncronous_io}) avvalora \var{si\_fd} con il numero del
file descriptor e \var{si\_band} per i \itindex{out-of-band} dati urgenti
-(vedi sez.~\ref{sec:TCP_urgent_data}) su un socket.
+(vedi sez.~\ref{sec:TCP_urgent_data}) su un socket, il segnale inviato alla
+scadenza di un timer POSIX (vedi sez.~\ref{sec:sig_timer_adv}) avvalora i
+campi \var{si\_timerid} e \var{si\_overrun}.
Benché sia possibile usare nello stesso programma sia \func{sigaction} che
\func{signal} occorre molta attenzione, in quanto le due funzioni possono
\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}
+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
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.
+della generazione dell'allarme, che proseguirà indefinitamente fintanto che
+non si disarmi il timer.
Se il timer era già stato armato la funzione sovrascrive la precedente
impostazione, se invece si indica come prima scadenza un tempo già passato,
segnali e non ne parla affatto in riferimento ai \textit{thread}.} quando
si usa un segnale come meccanismo di notifica, si può ottenere direttamente
questo valore nel campo \var{si\_overrun} della struttura \struct{siginfo\_t}
-restituita al gestore del segnale installato con \func{sigaction}, in questo
-modo non è più necessario eseguire successivamente una chiamata a questa
-funzione.
+(illustrata in fig.~\ref{fig:sig_siginfo_t}) restituita al gestore del segnale
+installato con \func{sigaction}; in questo modo non è più necessario eseguire
+successivamente una chiamata a questa funzione per ottenere il numero delle
+scadenze. Al gestore del segnale viene anche restituito, come ulteriore
+informazione, l'identificativo del timer, in questo caso nel campo
+\var{si\_timerid}.
Qualora si voglia rileggere lo stato corrente di un timer, ed ottenere il
tempo mancante ad una sua eventuale scadenza, si deve utilizzare la funzione
singolo (in gergo \textit{one shot}).
Infine, quando un timer non viene più utilizzato, lo si può cancellare,
-rimuovendolo dal sistema e recuperando le relative risorse, eseguendo
-l'operazione inversa rispetto a \funcd{timer\_create}. Per questo compito lo
-standard prevede una apposita funzione \funcd{timer\_delete}, il cui prototipo
-è:
+rimuovendolo dal sistema e recuperando le relative risorse, effettuando in
+sostanza l'operazione inversa rispetto a \funcd{timer\_create}. Per questo
+compito lo standard prevede una apposita funzione \funcd{timer\_delete}, il
+cui prototipo è:
\begin{functions}
\headdecl{time.h}
\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}] \param{timerid} non indica un timer valido.
- \end{errlist}
+ \begin{errlist}
+ \item[\errcode{EINVAL}] \param{timerid} non indica un timer valido.
+ \end{errlist}
}
\end{functions}
-
-% TODO trattare i Posix timer, e le funzioni:
-% timer_delete
-
+La funzione elimina il timer identificato da \param{timerid}, disarmandolo se
+questo era stato attivato. Nel caso poco probabile, ma comunque possibile, che
+un timer venga cancellato prima della ricezione del segnale pendente per la
+notifica di una scadenza, il comportamento del sistema è indefinito.
% 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
+% LocalWords: epoch multiplexing overrun
%%% Local Variables: