ok ce l'ho fatta
se a qualcuno può interessare ecco la soluzione:
codice:
/**Programma sviluppato in C che esegue la somma del valore dei
byte di un file con l'utilizzo di N processi.(N a scelta)**/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
/**Funzione che mi realizza la somma parziale dei byte per ogni processo.**/
void sommaparziale(char* buffer, int nbcount,int * fd){
int i=0;
int somma=0;
close(fd[0]);
for(;i<nbcount;i++){
somma+=*(buffer+i);
}
write(fd[1],&somma,sizeof(int));
close(fd[1]);
exit(0);
}
/**Punto di ingresso del programma.**/
int main(int argc,char** argv){
if(argc!=3){
printf("%s\n","Numero di parametri inseriti errato.\n");
exit(-1);
}
if(!(atoi(argv[2])>=1){
printf("%s\n","Numero di processi inseriti errato; richiesto un numero maggiore di 0.\n");
}
char *filename=argv[1];
printf("%s %s\n","Nome del file inserito: ",filename);
int numeroproc=atoi(argv[2]);
printf("%s %d\n","Numero dei processi inserito: ",numeroproc);
/**Inizializzazione variabili.**/
FILE* file;
int fileDim=0;
int somma;
long sommatot=0;
char* buffer;
/**Creazione pipe di comunicazione.**/
pid_t pid;
int fd[2];
pipe(fd);
/**Controllo esistenza file da analizzare.**/
if ((file=fopen(filename,"r"))==NULL){
fprintf(stderr,"%s\n","File inesistente.");
exit(-1);
}
/**Conteggio della dimensione del file.**/
fseek (file , 0 , SEEK_END);
fileDim = ftell (file);
rewind (file);
/**Creazione area di memoria per contenere il file da analizzare con successiva
lettura e copia del file in essa.**/
buffer=(char*)malloc(fileDim);
fread(buffer,1,fileDim,file);
/**Calcolo della quantità di byte che deve analizzare ogni processo.**/
int nbcount=fileDim/numeroproc;
int resto=fileDim%numeroproc;
/**Ciclo che crea i processi per il calcolo della somma e chiama su di essi
la funzione realizzata per il calcolo della somma parziale.**/
int i;
for(i=0;i<numeroproc;i++){
pid = fork();
if(pid==0){
if(i<(numeroproc-1)){
sommaparziale(buffer+(nbcount*i),nbcount,fd);
}else{
sommaparziale(buffer+(nbcount*i),nbcount+resto,fd);
}
}
}
/**Attesa da parte del processo padre della terminazione dei processi figli.**/
wait(NULL);
printf("%s\n","Processi figli terminati.\n");
close(fd[1]);
/**Calcolo della somma totale del valore dei byte.**/
for(i=0;i<numeroproc;i++){
read(fd[0],&somma,sizeof(int));
sommatot+=somma;
}
/**Stampa del valore finale calcolato, liberazione della memoria utilizzata e
uscita dal programma.**/
printf("\nLa somma totale dei byte è: %d\n",sommatot);
free(buffer);
exit(0);
}