Created
February 11, 2014 18:23
-
-
Save thecoder93/8940854 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* Sia dato un file di testo F contenete valori interi a 16 bit, un valore per riga, si | |
* definisca un modulo funzionale per la lettura e l'elaborazione dei dati secondo il | |
* seguente schema: | |
* 1) Crea tre processi figli; | |
* 2) Il processo principale (padre) legge i dati dal file F; | |
* 3) Inoltra ai figli i dati secondo la seguente regola: | |
* a) Gli interi pari sono inviati al primo figlio che ne fa la somma e li divide | |
* per il numero degli interi ricevuti +1; | |
* b) Gli interi dispari sono inviati al secondo figlio che ne fa la somma e ne | |
* estrae la radice; | |
* c) I valori zero sono inviati al terzo figlio per un loro conteggio. | |
* 4) Alla fine del file, i processi figli restituiranno i relativi valori al padre che | |
* li propone sul monitor. | |
*/ | |
#include <stdio.h> | |
#include <stdlib.h> | |
#include <unistd.h> | |
#include <sys/types.h> | |
#define MSGSIZE 26 | |
int elabora(); | |
int main(int argc, char *argv[]) | |
{ | |
int n = elabora(); | |
return 0; | |
} | |
int elabora() | |
{ | |
int i, j=0; | |
pid_t pid; | |
int stato; | |
int numero; | |
int retval; | |
int n, m , o; | |
char line[MSGSIZE]; | |
int fd1[2]; //array di fliedescriptor per numeri pari | |
int fd2[2]; | |
int fd3[2]; | |
FILE *fp = NULL; | |
if(retval = pipe(fd1)) //creo la pipe fd1 | |
{ | |
perror("piped 1"); | |
exit(1); | |
} | |
if(retval = pipe(fd2)) //creo la pipe fd2 | |
{ | |
perror("piped 2"); | |
exit(1); | |
} | |
if(retval = pipe(fd3)) //creo la pipe fd3 | |
{ | |
perror("piped 3"); | |
exit(1); | |
} | |
printf("Io sono il padre %d\n\n", getpid()); | |
for(i = 0; i <3; i++) | |
{ | |
pid = fork(); //fork | |
if(pid < 0) //controllo fork se andata a buon fine | |
{ | |
printf("Error"); | |
exit(EXIT_FAILURE); | |
} | |
else | |
if (pid == 0) //figli | |
{ | |
if(i==0) //primo figlio | |
{ | |
close(fd1[1]); //chiudo la scrittura della pipe fd1 | |
n = read(fd1[0], line, MSGSIZE); | |
printf("ALajgdsgd %d\n", n); | |
printf("%s", line); | |
} | |
else | |
if(i==1) //secondo figlio | |
{ | |
close(fd2[1]); //chiudo la scrittura della pipe fd2 | |
m = read(fd2[0], line, MSGSIZE); | |
printf("ACA %d\n", m); | |
} | |
else //terzo figlio | |
{ | |
close(fd3[1]); //chiudo la scrittura della pipe fd3 | |
o = read(fd3[0], line, MSGSIZE); | |
printf("blaca %d\n", o); | |
} | |
exit(0); | |
} | |
} | |
//Padre | |
//aspetta i figli | |
fp = fopen("file", "r"); //apre il file | |
if(fp == NULL) //fa un check sul file | |
{ | |
printf("Errore nell'apertura del file\n"); | |
exit(EXIT_FAILURE); | |
} | |
else | |
{ | |
close(fd1[0]); //chiudo la lettura della pipe fd1 | |
close(fd2[0]); //chiudo la lettura della pipe fd2 | |
close(fd3[0]); //chiudo la lettura della pipe fd3 | |
while(!feof(fp)) //legge il file | |
{ | |
fscanf(fp, "%d", &numero); | |
if(numero%2 == 0 && numero != 0) //controlla se sono pari e diversi da 0 | |
{ | |
write(fd1[1], "pari ", 5); | |
} | |
else if(numero%2 !=0 && numero !=0){ | |
write(fd2[1], "dispari ", 8); | |
printf("...\n"); | |
} | |
else{ | |
write(fd3[1], "zero ", 5); | |
printf("....\n"); | |
} | |
} | |
fclose(fp); | |
} | |
return 0; | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment