Skip to content

Instantly share code, notes, and snippets.

@thecoder93
Created February 11, 2014 18:23
Show Gist options
  • Save thecoder93/8940854 to your computer and use it in GitHub Desktop.
Save thecoder93/8940854 to your computer and use it in GitHub Desktop.
/* 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