#include <stdio.h>
#include <signal.h>

void sig_generic_handler (int sig)
{
  printf ("Ho intercettato il segnale n. %i.\n", sig);
}

void sigfpe_handler (int sig)
{
  printf ("Attenzione: ho intercettato il segnale "
          "SIGFPE (%i)\n"
          "            e devo concludere il "
          "funzionamento!\n", sig);
  exit (sig);
}

void sigterm_handler (int sig)
{
  printf ("Attenzione: ho intercettato il segnale "
          "SIGTERM (%i),\n"
          "            però non intendo rispettarlo.\n",
          sig);
}

void sigint_handler (int sig)
{
  printf ("Attenzione: ho intercettato il segnale "
          "SIGINT (%i),\n"
          "            però non intendo rispettarlo.\n",
          sig);
}

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;
}
