/* remove alarm, return remaining time */
return alarm(0);
}
-void alarm_hand(int sig) {
+void alarm_hand(int sig)
+{
/* check if the signal is the right one */
if (sig != SIGALRM) { /* if not exit with error */
printf("Something wrong, handler for SIGALRM\n");
/* remove alarm, return remaining time */
return alarm(0);
}
-void alarm_hand(int sig) {
+void alarm_hand(int sig)
+{
/* check if the signal is the right one */
if (sig != SIGALRM) { /* if not exit with error */
printf("Something wrong, handler for SIGALRM\n");
opportuna, di solito si pari al numero di bit dell'architettura della
macchina\footnote{nel caso dei PC questo comporta un massimo di 32 segnali
distinti, dato che in Linux questi sono sufficienti non c'è necessità di
- nessuna struttura più complicata}, ciascun bit del quale è associato ad uno
+ nessuna struttura più complicata.}, ciascun bit del quale è associato ad uno
specifico segnale; in questo modo è di solito possibile implementare le
operazioni direttamente con istruzioni elementari del processore; lo standard
POSIX definisce cinque funzioni per la manipolazione dei \textit{signal set},
\subsection{La funzione \func{sigaction}}
\label{sec:sig_sigaction}
-La funzione principale di questa nuova interfaccia è \func{sigaction}; il cui
-prototipo è:
+La funzione principale dell'interfaccia standard POSIX per i segnali è
+\func{sigaction}, essa ha sostanzialemente le stesse funzioni di
+\func{signal}, permette cioè di specificare come un segnale può essere gestito
+da un processo. Il suo prototipo è:
\begin{prototype}{signal.h}{int sigaction(int signum, const struct sigaction
*act, struct sigaction *oldact)}
caratteristiche della risposta al segnale, non solo la funzione del
manipolatore. Lo standard POSIX raccomanda di usare sempre questa funzione al
posto di \func{signal} (che in genere viene definita tramite essa), in quanto
-offre un controllo completo, sia pure al prezzo di una maggiore complessità
-d'uso.
+offre un controllo completo su tutti gli aspetti della gestione di un segnale,
+sia pure al prezzo di una maggiore complessità d'uso.
-Se il puntatore \param{act} non è nullo la funzione installa la nuova azione
+Se il puntatore \param{act} non è nullo, la funzione installa la nuova azione
da esso specificata, se \param{oldact} non è nullo il valore dell'azione
corrente viene restituito indietro. Questo permette (specificando \param{act}
nullo e \param{oldact} non nullo) di superare uno dei limiti di \func{signal},
che non consente di ottenere l'azione corrente senza installarne una nuova.
-Entrambi i puntatori fanno riferimento alla struttura \var{sigaction}, che
-permette di descrivere tutte le caratteristiche dell'azione associata ad un
+Entrambi i puntatori fanno riferimento alla struttura \var{sigaction}, tramite
+la quale si specificano tutte le caratteristiche dell'azione associata ad un
segnale. Anch'essa è descritta dallo standard POSIX ed in Linux è definita
-secondo quanto riportato in \secref{fig:sig_sigaction}, il campo
+secondo quanto riportato in \figref{fig:sig_sigaction}. Il campo
\var{sa\_restorer}, non previsto dallo standard, è obsoleto e non deve essere
più usato.
\label{fig:sig_sigaction}
\end{figure}
+Come riportato in \figref{fig:sig_sigaction} in Linux \func{sigaction} permette
+di specificare il manipolatore in due forme diverse, indicate dai campi
+\var{sa\_handler} e \var{sa\_sigaction}; esse devono essere usate in maniera
+alternativa (in certe implementazioni questi vengono specificati come
+\ctyp{union}); la prima è quella classica usata anche con \func{signal}, la
+seconda permette invece di usare un manipolatore in grado di ricevere
+informazioni più dettagliate dal sistema (ad esempio il tipo di errore in caso
+di \macro{SIGFPE}).
+
+
+
\subsection{La gestione del blocco dei segnali}