#include "utility.h" main(int argc, char **argv) { int padre; int k=0,i,rcv=0,z,x; int entra_in_campo,unoxvolta,privato; int nproc; int punteggio=0; int coda; bool flag=VERO; matrice * gioco; sms messaggio; int fine; notes block; smallnotes finale; if (argc > 1) { int nproc = atoi(argv[1]); initarray(block,nproc,0); if ((nproc % 2) == 0) { if (((entra_in_campo = creasem(CHIAVE,1)) != -1)&& ((unoxvolta = creasem(KEYMTX,1)) != -1) && ((coda = creacoda(KEYCODA)) != -1)) { gioco = (matrice *)(attachshm(creashm(KEYSHM, sizeof(matrice)))); for (i=1;i <= nproc ; i++) { if ((padre = fork()) != -1) { if (padre == 0) //codice figlio { down(entra_in_campo,0,-1); printf("Entra in campo %d\n",getpid()); fflush(stdout); for (z=1;z<=2;z++) { if (z==1) { privato= creasem(IPC_PRIVATE,1); initsem(privato,0); } if (z==2) { printf("Rigioca %d\n",getpid()); fflush(stdout); flag=VERO; punteggio=0; initsem(unoxvolta,1); } while(flag==VERO ) { down(unoxvolta,0,-1); //printf("GIOCO %d\n",getpid()); fflush(stdout); flag = visita(gioco,nproc,&punteggio); up(unoxvolta,0,1); sleep(1); } crea_sms(getpid(),punteggio,privato,&messaggio); sms_send(coda,&messaggio); printf("Esce dal campo %d Punteggio %d\n",getpid(),punteggio);fflush(stdout); down(privato,0,-1); } exit(0); } } else printf("Errore nella fork\n"); } for (i=1; i <= nproc; i++) { fine = sms_rcv(coda,&messaggio); salva_sms(block,k,&messaggio,fine); k++; rcv++; if ((rcv%2)==0) { inizializzacampo(gioco,nproc); stampacampo(gioco,nproc); up(entra_in_campo,0,2); } if (rcv == nproc) { qsort(block, nproc, sizeof(data), blockcompare); stamparray(block,nproc); inizializzacampo(gioco,nproc); stampacampo(gioco,nproc); up(block[0].sem_id,0,1); up(block[1].sem_id,0,1); fine = sms_rcv(coda,&messaggio); salva_sms(finale,0,&messaggio,fine); fine = sms_rcv(coda,&messaggio); salva_sms(finale,1,&messaggio,fine); if (finale[0].punti>finale[1].punti) { printf("\nAnd the WINNER is %d\n\n",finale[0].pid); fflush(stdout); } else { printf("\nAnd the WINNER is %d\n\n",finale[1].pid); fflush(stdout); } for(x=0;x<nproc;x++) { kill(block[x].pid,SIGKILL); delsem(block[x].sem_id); } } } }else printf("Errore nell'accesso ai semafori\n"); }else printf("\nAttenzione il programma necessita di parametro pari\n"); }else printf("\nAttenzione il programma necessita di parametro \n"); for(i=1;i<=nproc;i++) wait(0); if (execl("2narbitro","2narbitro","0",NULL)== -1) printf("\n Errore nel lancio dell'arbitro\n"); }