All pastes #2011570 Raw Edit

Untitled

public text v1 · immutable
#2011570 ·published 2010-12-06 00:24 UTC
rendered paste body
#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], eof = EOF;
	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 */
	}
	close(andata[1]);
	/* 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("nbyte=%d. Ho letto il nome della ruota %s, ora estraggo i 5 numeri\n", nbyte, m.nome_ruota); /* 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));
		}
		close(ritorno[0]);
		close(ritorno[1]);
		close(andata[0]);
	}
	else
	{
		/* Padre: legge la risposta del figlio e stampa */
		//wait();
		close(ritorno[1]);
		close(andata[0]);
		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]);
			}
		}
		close(ritorno[0]);
	}
	printf("k=%d termina qui\n", k);
	exit(0);
}


void estrai(int *array, int *x, int j){
	x[j] = rand()%(90-j);
	array[x[j]] = array[89 - j];
}