/* TESTO A

Si realizzi una coppia client/server, senza utilizzare socket, che abbia il seguente
comportamento:

- il server rimane in attesa;
- il client, una volta invocato con parametro numerico n (con 0 < n < 10), crea n figli;
- ogni figlio attende un tempo casuale tra 1 e 5 secondi, terminato il quale genera un
numero casuale nel range [1-5], lo visualizza a video e lo invia al server;
- Il server accumula tutti i valori che gli vengono inviati, stampando il valore
accumulato ad ogni ricezione di un nuovo valore.
- Il server, inoltre, alla ricezione di un segnale SIGUSR1 visualizza a video il valore
accumulato.

*/

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <signal.h>
#include <string.h>
#include <netinet/in.h>
#include <netdb.h>
#include <fcntl.h>
#include <arpa/inet.h>


int main(int argc, char *argv[])
{
  int n,pid,buffer,f,i;

  //se non c'e' un parametro da linea di comando esco
  if(argc!=2 && (atoi(argv[1])<0 || atoi(argv[1])>10) )
    {
      printf("Utilizzo: client <numero 0-10>\n");
      exit(0);
    }

  //numero di figli da creare
  n=atoi(argv[1]);

  //apro la fifo in scrittura
  if((f=open("pippo",O_WRONLY))<0)
    {
      perror("open file client");
      exit(0);
    }

  //ciclo di creazione figli
  for(i=0;i<n;i++)
    {
      if((pid=fork())<0)
	{
	  perror("fork");
	  exit(0);
	}
      if(pid==0)
	{
	  //CODICE FIGLIO //////////

	  //inizializzo il generatore di numeri casuali
	  srand(getpid());

	  //attendo un tempo casuale
	  sleep(rand()%5+1);

	  //genero il numero casuale da spedire
	  buffer=rand()%5+1;

	  printf("Figlio %d scrive %d ed esce\n",getpid(),buffer);
	  fflush(NULL);

	  if(write(f,&buffer,sizeof(buffer))<=0)
	    {
	      perror("write");
	      exit(0);
	    }

	  close(f);

	  return 0;
	  //////////////////////////
	}
    }

  return 0;
}
