/* fork.c
 * Stefano Salvi - 12/9/02
 * programma genera 10 processi figli successivamente ogni
 * figlio stampa il suo nome a distanza di un secondo l'uno dall'altro.
 * Poi i figli ritornano  100 + n°figlio e il pgm stampa
 */ 

#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>

#define NUMP 10		/* Numero di figli da generare */

int main()
{
int i,pid;

  // Genera i 10 processi
  for(i=0;i<NUMP;i++)
  {
    if((pid=fork())==0)
    {					// pid=0 -> figlio
      usleep(50000*(1+i));		// Ritardo iniziale
      printf("Figlio: %d\n",i+1);	// Stampa messaggio del figlio
      usleep(500000*(1+i));		// Ritardo finale
      return(101+i);			// Termina con codice di ritorno
    } else { // pid <> 0 -> padre (il pid e' quello del figlio)
      printf("Ho generato il figlio %d con pid %d\n",i+1,pid);
    }
  }

  // Attende che dieci processi terminino
  for(i=0;i<NUMP;i++)
  {
  int status;
    wait(&status);		// Attende termine di un figlio (uno qualunque)
    printf("Terminato processo %d\n",WEXITSTATUS(status));
  }
}

