C/Appendice/Librerie standard/signal.h: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Riga 88:
 
La funzione richiede come argomento il numero del segnale da attivare e restituisce un valore pari a zero in caso di successo, altrimenti restituisce un valore diverso da zero. Naturalmente, a seconda dell'azione che viene intrapresa all'interno del programma, a seguito della ricezione del segnale, può darsi che dopo questa funzione non venga eseguito altro, pertanto non è detto che possa essere letto il valore che la funzione potrebbe restituire.
 
=== Esempio ===
Esempio
 
Viene proposto un esempio che serve a dimostrare il meccanismo di provocazione e intercettazione dei segnali:
<source lang="c">
#include <stdio.h>
#include <signal.h>
 
void sig_generic_handler (int sig)
{
printf ("Ho intercettato il segnale n. %d.\n", sig);
}
 
void sigfpe_handler (int sig)
{
printf ("Attenzione: ho intercettato il segnale SIGFPE (%d)\n", sig);
printf (" e devo concludere il funzionamento!\n", sig);
exit (sig);
}
 
void sigterm_handler (int sig)
{
printf ("Attenzione: ho intercettato il segnale SIGTERM (%d),\n", sig);
printf (" però non intendo rispettarlo.\n");
}
 
void sigint_handler (int sig)
{
printf ("Attenzione: ho intercettato il segnale SIGINT (%d),\n", sig);
printf (" però non intendo rispettarlo.\n");
}
 
int main (void)
{
signal (SIGFPE, sigfpe_handler);
signal (SIGTERM, sigterm_handler);
signal (SIGINT, sigint_handler);
signal (SIGILL, sig_generic_handler);
signal (SIGSEGV, sig_generic_handler);
 
int c;
int x;
 
printf ("[0][Invio] divisione per zero\n");
printf ("[c][Invio] provoca un segnale SIGINT\n");
printf ("[t][Invio] provoca un segnale SIGTERM\n");
printf ("[q][Invio] conclude il funzionamento\n");
while (1)
{
c = getchar();
if (c == '0')
{
printf ("Sto per eseguire una divisione per zero:\n");
x = x / 0;
}
else if (c == 'c')
{
raise (SIGINT);
}
else if (c == 't')
{
raise (SIGTERM);
}
else if (c == 'q')
{
return 0;
}
}
return 0;
}
</source>
All'inizio del programma vengono definite delle funzioni per il trattamento delle situazioni che hanno provocato un certo segnale. Nella funzione main(), prima di ogni altra cosa, si associano tali funzioni ai segnali principali, quindi si passa a un ciclo senza fine, nel quale possono essere provocati dei segnali premendo un certo tasto, come suggerito da un breve menù. Per esempio è possibile provocare la condizione che si verifica tentando di dividere un numero per zero.
 
La divisione per zero fa scattare il segnale SIGFPE che viene intercettato dalla funzione sigfpe_handler(), la quale però non può far molto e così conclude anche il funzionamento del programma.
{{Avanzamento|50%|31 dicembre 2009}}