Skip to content

Instantly share code, notes, and snippets.

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