si la fork è obbligatoria dato che è la parte principale del lavoro...
ti posto il codice di nave.c (dove sta il problema) se poi vuoi anche gli altri te li passo
codice:
#include "libporto.h"
int main()
{
int pid_canale; //pid del canale
int pid_capitaneria; //pid della capitaneria
int num_navi; //numero di navi create
int i; //indice per il ciclo for
int pid; //pid per la fork()
int wait_son; //wait()
int senso_unico; //indirizzo del pool di semafori del senso unico alternato
int sem_cont; //indirizzo del semaforo contatore
boat nave; //struttura contenente i dati della nave
msgpid canale_pid; //messaggio con pid del canale
msgpid capitaneria_pid; //messaggio con pid della capitaneria
sem_cont = crea_semafori(1, SEMCONT); //crea il semaforo contatore
semctl(sem_cont, 0, SETVAL, 10); //inizializza il semaforo contatore
printf("Il pid di nave è: %d\n", getpid()); //stampa il pid del processo
invia_pid(getpid(), "NAVE", PID_NAVE); //invia il pid agli altri processi
invia_pid(getpid(), "NAVE", PID_NAVE);
printf("Attendo i pid degli altri due processi\n");
printf("Quante navi vuoi gestire? ");
scanf("%d", &num_navi);
//esegue finché non ottiene i pid dei due processi complementari
do{
if(strcmp(canale_pid.mittente, "CANALE") != 0)
{
canale_pid = ricevi_pid(PID_CANALE); //riceve il messaggio
pid_canale = canale_pid.p_npid; //assegna il pid
}
if(strcmp(capitaneria_pid.mittente, "CAPITANERIA") != 0)
{
capitaneria_pid = ricevi_pid(PID_CAPITANERIA); //riceve il messaggio
pid_capitaneria = capitaneria_pid.p_npid; //assegna il pid
}
} while(strcmp(canale_pid.mittente, "CANALE") != 0 || strcmp(capitaneria_pid.mittente, "CAPITANERIA") != 0);
printf("PID_CANALE è %d\n", pid_canale);
printf("PID_CAPITANERIA è %d\n", pid_capitaneria);
senso_unico = semget(SEMALT, 0, 0);
for(i = 1; i <= num_navi;) //ciclo for necessario per creare i processi figlio
{ //APERTURA FOR
pid = fork(); //fork() su pid per creare il figlio
if(pid) //if(pid != 0) entro nel codice del processo padre
{ //APERTURA IF-THEN(1)
printf("SUN EL PARE\n");
i++; //incremento l'indice del ciclo for per evitare il loop
fflush(stdout); //chiude lo stream
wait_son = wait(0); //il processo padre aspetta la terminazione del processo figlio
fflush(stdout); //chiude lo stream
} //CHIUSURA IF-THEN(1)
else //if(pid == 0) entro nel codice del processo figlio
{ //APERTURA IF-ELSE(1)
printf("SONO IL FIGLIO\n");
S(senso_unico, 0); //controllo per l'accesso al porto
P(sem_cont, 0); //decremento il valore del semaforo
nave = crea_nave(i); //creazione della nave
invia_msg(getpid(), nave); //invio messaggio a capitaneria
kill(pid_capitaneria, SIGINT); //segnala l'invio del messaggio
//S(senso_unico, 1);
//V(sem_cont, 0);
i = num_navi + 1; //incremento dell'indice per l'uscita dal ciclo
fflush(stdout); //chiude lo stream
} //CHIUSURA IF-ELSE(1)
} //CHIUSURA FOR
return 0;
}