Created
February 19, 2014 11:17
-
-
Save thecoder93/9090101 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
#include <stdio.h> | |
#include <sys/types.h> | |
#include <stdlib.h> | |
#include <unistd.h> | |
#include <fcntl.h> | |
void usage(); | |
int main(int argc, char *args[]){ | |
short int **matrice; //Array di array per la matrice | |
int i, j; //Indici per i for | |
int righe, colonne; //Numero righe e colonne della matrice dinamica | |
pid_t pid; //Variabile per la fork() | |
short int *vett1; | |
short int *vett2; | |
short int *vett_padre1; | |
short int *vett_padre2; | |
short int somma_vett1=0; | |
short int somma_vett2=0; | |
int somma = 0; | |
int fd[2]; //Vettore per la pipe per comunicare con il padre | |
//Creo la pipe. In caso di esito negativo restituisco gli errori. | |
if(pipe(fd)<0){ | |
perror("Errore nella creazione della pipe\n"); | |
exit(1); | |
} | |
if (fcntl(fd[0],F_SETFL,O_NDELAY)<0) exit(1); | |
//Controllo dei parametri di input | |
if(argc == 3){ | |
righe = atoi(args[1]); | |
colonne = atoi(args[2]); | |
if(righe %2 != 0){ | |
printf("\nErrore. La dimensione delle righe deve essere pari\n"); | |
usage(); | |
exit(1); | |
} | |
//Allocazione dinamica della matrice | |
matrice = (short int **)malloc(righe * sizeof(short int *)); | |
for(i=0; i<righe; i++) | |
matrice[i] = (short int *)malloc(colonne * sizeof(short int)); | |
//Popolamento matrice | |
for(i=0; i<righe; i++) | |
for(j=0; j<colonne; j++){ | |
printf("Inserisci M[%d][%d] = ", i,j); | |
scanf("%hd", &matrice[i][j]); | |
} | |
} | |
//Adesso creo due processi figli | |
for(i=0; i<2; i++){ | |
if((pid = fork()) < 0){ | |
printf("Errore nella fork()\n"); | |
exit(1); | |
} | |
//Sono il figlio | |
if(!pid){ | |
//Sono il primo figlio. Il primo figlio si occupa della somma delle righe pari. | |
printf("\nCiao sono il figlio che somma le righe pari\n"); | |
vett1 = (short int *) calloc(righe, sizeof(short int*)); //Creo un vettore già inizializzato a 0 di dimensione delle righe | |
//Somma righe pari | |
for(i=0; i<righe; i++) | |
for(j=0; j<colonne; j++){ | |
if(i%2 == 0) | |
vett1[i] += matrice[i][j]; | |
else | |
continue; | |
} | |
//Adesso devo mandare al padre il vettore tramite pipe | |
//Chiudo la pipe in lettura e scrivo su fd[1] | |
close(fd[0]); | |
write(fd[1], vett1, sizeof(vett1)); | |
//Sono il secondo figlio. Il secondo figlio si occupa della somma delle righe dispari | |
printf("Ciao sono il figlio che somma le righe dispari\n\n"); | |
vett2 = (short int *) calloc(righe, sizeof(short int*)); //Creo un vettore già inizializzato a 0 di dimensione delle righe | |
//Somma righe dispari | |
for(i=0; i<righe; i++) | |
for(j=0; j<colonne; j++){ | |
if(i%2 != 0) | |
vett2[i] += matrice[i][j]; | |
else | |
continue; | |
} | |
close(fd[0]); | |
write(fd[1], vett2, sizeof(vett2)); | |
break; //Il break mi serve per non creare nipoti | |
} | |
} | |
if(pid > 0){ | |
wait(NULL); //Il padre aspetta i due figli che finiscano i loro conti | |
printf("\nCiao sono il padre\n"); | |
//Creo i due vettori risultanti inizializzati a 0 | |
vett_padre1 = (short int *) calloc (righe, sizeof(short int*)); | |
vett_padre2 = (short int *) calloc (righe, sizeof(short int*)); | |
//Leggo dalla pipe dei figli | |
//Quindi chiudo la scrittura fd[1] e leggo da fd[0] | |
close(fd[1]); | |
read(fd[0],vett_padre1, sizeof(vett_padre1)); | |
read(fd[0],vett_padre2, sizeof(vett_padre2)); | |
//Adesso faccio la somma dei vettori | |
for(i=0; i<righe; i++) | |
somma_vett1 += vett_padre1[i]; | |
for(i=0; i<righe; i++) | |
somma_vett2 += vett_padre2[i]; | |
printf("Ciao sono il padre e la somma dei vettori che mi hanno mandato i miei figli è: %hd, %hd\n\n", somma_vett1, somma_vett2); | |
} | |
else | |
exit(1); | |
exit(0); | |
} | |
//Implementazione funzioni | |
void usage(){ | |
printf("Nome_programma num_righe_pari num_colonne\n"); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment