PDA

Visualizza la versione completa : [C] Checksum di un file attraverso processi concorrenti.


Giandella
27-03-2008, 21:24
Innanzitutto salve a tutti :)

Devo realizzare un programma checksum <InputFileName><N> che calcoli la checksum (dimensione totale del valore dei byte contenuti nel file) del file passato in ingresso tramite N processi (oltre al processo main) con cui suddividere il lavoro.

I vincoli del programma sono l'utilizzo di pipe per la comunicazione fra processi e la stampa del valore di checksum da parte del processo main.

Visto che ho poco tempo per realizzare questo programma chiunque abbia delle idee su come realizzarlo mi sarebbe di grande aiuto, grazie in ogni caso :zizi:

Giandella
03-04-2008, 20:44
ok ce l'ho fatta :D

se a qualcuno può interessare ecco la soluzione:




/**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);
}

Loading