codice:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/wait.h>
#include <time.h>
#include <math.h>
main(int argc, char** argv){
FILE *fd1;
FILE *fd2;
double value, ordine;
int i, j, k;
srand(time(NULL));
fd1 = fopen(argv[1],"wb");
fd2 = fopen(argv[2],"wb");
ordine = 2;
fwrite(&ordine, sizeof(double), 1, fd1);
fwrite(&ordine, sizeof(double), 1, fd2);
printf("ordine = %f\n", ordine);
for(i=0;i<5;i++){
for(j=0;j<ordine;j++){
for(k=0;k<ordine;k++){
value = rand()%10;
fwrite(&value,sizeof(value),1,fd1);
value = rand()%10;
fwrite(&value,sizeof(value),1,fd2);
}
}
printf("Matrice \n");
}
printf("FATTO!\n");
fclose(fd1);
fclose(fd2);
}
e per leggere i file creati uso il seguente codice che mi stampa nel terminale il contenuto del file che gli passo in ingresso.
codice:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/wait.h>
void workerA1(char* fname, int* ch1);
void workerA2(char* fname, int* ch2);
void workerMol(int* ch1, int* ch2, int*ch3, double ordine, double **a, double **b, double **c);
void workerSum(int* ch3, int*ch4, double ordine, int NStep, double **d);
void Updater(char* fname, int* ch4, double ordine, int NStep, double **e);
double prodmat(double **a, double **b, double **c, double ordine);
main (int argc, char** argv){
FILE *fdi;
int i, j;
int NStep = atoi(argv[4]);
int ns = 0;
double ordine, value;
double **a, **b, **c, **d, **e;
pid_t pid;
int channel1[2],channel2[2], channel3[2], channel4[2];
pipe(channel1);
pipe(channel2);
pipe(channel3);
pipe(channel4);
fdi = fopen(argv[1],"rb");
if (fdi < 0){
perror("Errore nell'apertura del file.");
exit(1);
}
fread(&ordine,sizeof(double),1,fdi);
printf("l'ordine è: %f\n", ordine);
fclose(fdi);
printf("NStep : %d\n", NStep);
pid = fork();
if(pid == 0){
workerA1(argv[1],channel1);
exit(0);
}
pid = fork();
if(pid == 0 ){
workerA2(argv[2],channel2);
exit(0);
}
pid = fork();
if(pid == 0){
a= (double**)malloc(ordine*sizeof(double*));
for (i=0; i<ordine; i++){
a[i]=(double*)malloc(ordine*sizeof(double));
}
b = (double**)malloc(ordine*sizeof(double*));
for (i=0; i<ordine; i++){
b[i]=(double*)malloc(ordine*sizeof(double));
}
c = (double**)malloc(ordine*sizeof(double*));
for (i=0; i<ordine; i++){
c[i]=(double*)malloc(ordine*sizeof(double));
}
workerMol(channel1,channel2, channel3, ordine, a, b, c);
exit(0);
}
pid = fork();
if(pid == 0){
d = (double**)calloc(ordine, sizeof(double*));
for (i=0; i<ordine; i++){
d[i]=(double*)calloc(ordine, sizeof(double));
}
workerSum(channel3, channel4, ordine, NStep, d);
exit(0);
}
pid = fork();
if(pid == 0){
e = (double**)malloc(ordine*sizeof(double*));
for (i=0; i<ordine; i++){
e[i]=(double*)malloc(ordine*sizeof(double));
}
Updater(argv[3], channel4, ordine, NStep, e);
exit(0);
}
for(i=0;i<5;i++){
wait(NULL);
}
free(a);
free(b);
free(c);
free(d);
free(e);
}
void workerA1(char* fname, int* ch1){
FILE *fd;
double value;
printf("Worker A1 \n");
fd = fopen(fname,"rb");
if (fd < 0){
perror("Errore nell'apertura del file.");
exit(1);
}
fseek(fd, sizeof(double), SEEK_SET);
close(ch1[0]);
while(!feof(fd)){
fread(&value,sizeof(double),1,fd);
write(ch1[1],&value,sizeof(value));
}
printf("Fine lettura A1\n");
fclose(fd);
value = -1;
write(ch1[1],&value,sizeof(value));
printf("Value fine primo figlio: %f\n", value);
close(ch1[1]);
exit(0);
}
void workerA2(char* fname, int* ch2){
FILE *fd;
double value;
printf("Worker A2 \n");
fd = fopen(fname,"rb");
if (fd < 0){
perror("Errore nell'apertura del file.");
exit(1);
}
fseek(fd, sizeof(double), SEEK_SET);
close(ch2[0]);
while(!feof(fd)){
fread(&value,sizeof(double),1,fd);
write(ch2[1],&value,sizeof(value));
}
printf("Fine lettura A2\n");
value = -1;
write(ch2[1],&value,sizeof(value));
printf("Value fine secondo figlio: %f\n", value);
fclose(fd);
close(ch2[1]);
exit(0);
}
void workerMol(int* ch1, int* ch2, int*ch3, double ordine, double **a, double **b, double **c){
double value1, value2;
int i, j;
close(ch1[1]);
close(ch2[1]);
close(ch3[0]);
/*Alloco la memoria per le tre matrici*/
printf("WorkerMol \n");
while(value1 != -1 && value2 != -1){
for (i=0; i<ordine; i++){
for (j=0; j<ordine; j++){
if(value1 != -1){
read(ch1[0],&value1,sizeof(value1));
if(value1 != -1){
a[i][j]=value1;
}
}else if(value1 == -1 && value2 == -1){
i=ordine+1;
}
if(value2 != -1){
read(ch2[0],&value2,sizeof(value2));
if(value2 != -1){
b[i][j]=value2;
}
}else if(value1 == -1 && value2 == -1){
i=ordine+1;
}
}
}
prodmat(a, b, c, ordine);
for (i=0; i<ordine; i++){
for (j=0; j<ordine; j++){
write(ch3[1],&c[i][j],sizeof(double));
}
}
}
printf("Fine moltiplicazione\n");
write(ch3[1],&value1,sizeof(value1));
printf("Value fine terzo figlio: %f\n", value1);
close(ch1[0]);
close(ch2[0]);
close(ch3[1]);
//free(a);
//free(b);
//free(c);
exit(0);
}
/*metodo per fare il prodotto tra matrici*/
double prodmat(double **a, double **b, double **c, double ordine){
int i, j, k;
for (i=0; i<ordine; i++){
for (j=0; j<ordine; j++){
c[i][j]=0;
for (k=0; k<ordine; k++){
c[i][j]= c[i][j]+(a[i][k]*b[k][j]);
}
}
}
}
/*metodo per fare la somma tra matrici*/
void workerSum(int* ch3, int*ch4, double ordine, int NStep, double** d){
double value;
int i, j;
int ns = 0;
printf("WorkerSum \n");
close(ch3[1]);
close(ch4[0]);
while(value != -1){
for (i=0; i<ordine; i++){
for (j=0; j<ordine; j++){
read(ch3[0],&value,sizeof(value));
if(value != -1){
d[i][j]+=value;
printf("la matrice somma: %f \n", d[i][j]);
}else{
i=ordine+1;
}
}
}
if(value != -1){
ns++;
printf("ns: %d \n", ns);
if(ns == NStep){
for (i=0; i<ordine; i++){
for (j=0; j<ordine; j++){
write(ch4[1],&d[i][j],sizeof(value));
}
}
ns=0;
}
}else{
for (i=0; i<ordine; i++){
for (j=0; j<ordine; j++){
write(ch4[1],&d[i][j],sizeof(value));
}
}
}
}
printf("Fine somme\n");
write(ch4[1],&value,sizeof(value));
printf("Value fine quarto figlio: %f\n", value);
close(ch3[0]);
close(ch4[1]);
//free(d);
exit(0);
}
void Updater(char* fname, int* ch4, double ordine, int NStep, double **e){
FILE *fdo;
int i, j;
double value;
printf("Updater \n");
fdo = fopen(fname, "wb");
if (fdo < 0){
perror("Errore nell'apertura del file.");
exit(1);
}
printf("Ordine updater:%f \n", ordine);
fwrite(&ordine, sizeof(ordine), 1, fdo);
close(ch4[1]);
while(value != -1){
for (i=0; i<ordine; i++){
for (j=0; j<ordine; j++){
read(ch4[0],&value,sizeof(value));
if(value != -1){
e[i][j]=value;
fwrite(&e[i][j],sizeof(double), 1, fdo);
}else{
i=ordine+1;
}
}
}
}
close(ch4[0]);
fclose(fdo);
//free(e);
exit(0);
}
Non capisco dove sbaglio, sono giorni che ci sto dietro!!