#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
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];
}