#include #include #include void estrai(int *array, int *x, int j); main(){ int andata[2], ritorno[2], array[90], x[5], i, k, nbyte; char nome_file[256] = "nomi_ruote.txt", nome[20]; FILE *fp; struct msg { char nome_ruota[20]; int estratto[5]; } m; /* Apro le pipe e chiudo le parti che non interessano al padre */ if (pipe(andata) == -1){ perror("Errore apertura pipe andata: "); exit(1); } close(andata[0]); if (pipe(ritorno) == -1){ perror("Errore apertura pipe ritorno: "); exit(1); } close(ritorno[1]); /* Apro il file, leggo il nome della ruota e lo scrivo sulla pipe */ fp = fopen(nome_file, "r"); while((fscanf(fp, "%s", nome)) != EOF){ printf("Ho letto la ruota %s, ora la scrivo sulla pipe!\n", nome); /* Debug */ printf("fd: %d, nome: %s, sizeof: %d\n", andata[1], nome, sizeof(char)*20); /* Debug */ if ( (write(andata[1], nome, sizeof(char)*20)) == -1 ){ perror("Errore nella scrittura: "); exit(1); } printf("Ho scritto\n"); /* Debug */ } /* Creo il figlio */ if ( (k = fork()) == -1){ perror("Errore nella fork: "); exit(1); } if (k == 0){ /* Ramo del processo figlio: chiudo la pipe dove non mi interessa, leggo il nome, estraggo e riscrivo su pipe2 */ close(andata[1]); close(ritorno[0]); /* Inizializzo l'array che mi servir per l'estrazione */ for(i = 0; i < 90; i++){ array[i] = i; } printf("Sono il figlio\n"); /* Debug */ while ( (nbyte = read(andata[0], m.nome_ruota, sizeof(char) * 20)) != 0){ if(nbyte == -1){ perror("Errore nella read: "); exit(1); } /* Ho letto il nome della ruota, ora estraggo i 5 numeri */ printf("Ho letto il nome della ruota %s, ora estraggo i 5 numeri", nome); /* Debug */ for(i = 0; i < 5; i++){ estrai(array, x, i); } /* Salvo i numeri estratti nel messaggio da rispedire al padre */ for(i = 0; i < 5; i++){ m.estratto[i] = x[i]; } /* Scrivo la risposta sulla pipe */ write(ritorno[1], m, sizeof(struct msg)); } } /* Padre: legge la risposta del figlio e stampa */ while( (nbyte = read(ritorno[0], m, sizeof(struct msg)) ) > 0){ printf("\nSulla ruota di %s sono stati estratti i numeri: ", m.nome_ruota); for(i=0; i<5; i++){ printf("%d ", m.estratto[i]); } } exit(0); } void estrai(int *array, int *x, int j){ x[j] = rand()%(90-j); array[x[j]] = array[89 - j]; }