edit: il lavoro ora è a questo punto.. come dite di proseguire?
#include "libporto.h"
/* metodo che assegna in modo casuale un tipo di merce */
char *get_merce()
{
char *prodotto; //stringa a cui si assegna il tipo di prodotto
int valore; //valore a cui si assegnerà un numero casuale
srand(getpid()); //senza questo il random restituisce sempre lo stesso num ???
valore = rand() % 5 + 1; //assegna un valore casuale da 1 a 5 alla variabile valore
switch(valore) //assegna il tipo di prodotto in base al numero generato
{
case 1:
prodotto = ("TABACCO");
break;
case 2:
prodotto = ("ACCIAIO");
break;
case 3:
prodotto = ("FERRO");
break;
case 4:
prodotto = ("AUTOMOBILI");
break;
case 5:
prodotto = ("PNEUMATICI");
break;
deafult:
printf("*****ERRORE*****\n");
break;
}
return prodotto; //restituisce il prodotto
}
/* metodo che assegna in modo casuale una quantità ad un carico di merce */
int get_quantita()
{
int t; //variabile contenente il peso della merce in tonnellate
srand(getpid()); //senza questo il random restituisce sempre lo stesso num ???
t = rand() % 120 + 1; //assegna un valore casuale da 1 a 120 alla variabile valore
return t;
}
int get_numnavi()
{
int n; //variabile contenente il numero delle navi
srand(getpid()); //senza questo il random restituisce sempre lo stesso num ???
n = rand() % 15 + 1; //assegna un valore casuale da 1 a 120 alla variabile valore
return n;
}
int main()
{
int pid; //variabile sulla quale eseguo fork()
int n; //variabile sulla quale eseguo wait()
boat nave; //struttura nave di tipo boat definita in "libporto.h"
int i; //variabile contenente l'indice necessario per il ciclo for
int num_navi;
num_navi = get_numnavi();
for (i = 1; i <= num_navi//ciclo for necessario per creare 10 processi figlio
{ //APERTURA FOR
pid = fork(); //fork() su pid per creare il figlio
if (!pid) //quando pid == 0 entro nel codice del processo figlio
{
printf("\n\nSono il figlio %d \n", getpid()); //e' stato creato il figlio del quale stampo il pid
nave.identificatore = getpid(); //assegna all'identificatore della nave l'identificatore del processo
nave.merce = get_merce(); //assegna un tipo random di merce con la funzione get merce
nave.quantita = get_quantita(); //assegna una quantita random di merce con la funzione get quantita
printf("Identificatore nave ---> %d \n", i); //stampa l'identificatore della nave
printf("Merce contenuta sulla nave ---> %s \n", nave.merce); //stampa la merce trasportata dalla nave
printf("Quantità di merce contenuta sulla nave ---> %d tonnellate\n", nave.quantita); //stampa la quantità della merce contenuta sulla nave
i = num_navi + 1; //serve per farmi uscire dal ciclo, ovvero il figlio non effettua ulteriori fork()
}
else //invece quando pid == 1 entro nel codice del processo padre
{
i++; //incremento l'indice del ciclo for per evitare il loop
printf("Sono il padre %d\n", getppid()); //stampo il pid del padre
n = wait(0); //il processo padre aspetta la terminazione del processo figlio
if(n > 0) //se la variabile contiene un numero maggiore di zero (pid del figlio)
printf("Terminato il figlio %d\n", n); //allora significa che il processo figlio è terminato
}
} //CHIUSURA FOR
return 0;
}
e questa la libporto.h
#ifndef molo
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <unistd.h>
#define molo
typedef struct {
long type;
int npid;
char str[30];
} msg;
typedef struct {
int quantita;
char *merce;
int identificatore;
} boat;
char *get_merce();
int get_quantita();
int get_numnavi();
#endif