/* Correction du TP de programmation système UNIX

   TP exécution de commandes en parallèle

   Question 4

   -
   Antoine Miné
   24/03/2007
 */

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>

/* handler de signal */
void get_signal(int sig)
{
  printf("%i a reçu le signal %i\n",getpid(),sig);

  /* réinstalle le handler par défaut
     (ceci est fait automatiquement sur certaines version d'Unix, mais pas
     toutes) 
  */
  signal(sig,SIG_DFL);

  /* relance le signal */
  kill(getpid(), sig);
}


int main(int argc, char* argv[])
{
  pid_t p = getpid();
  int n;

  /* installe un handler pour tous les signaux */
  for (n=1;n<32;n++)
    signal(n,get_signal);

  if (argc!=2) printf("argument attendu\n");
  else  {
    n = atoi(argv[1]);
    printf("%i: début\n",p);
    while (n>0) {
      printf("%i: %i\n",p,n);

      /* en cas d'interruption par un signal, sleep peut retourner avant
	 1 seconde... */
      sleep(1);

      n--;
    }
    printf("%i: fin\n",p);
  }
  return 0;
}
