Hola!! Necesito ayuda, mi programa debe multiplicar dos matrices utilizando pipes pero la verdad no tengo idea de como hacerlo , he avanzado un poco pero aun falta mucho por hacer... Espero me puedan ayudar a completar mi codigo...
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
int m,n,p; /*Variables que contendran las dimensiones de las matrice*/
int **matdfA,**matdfB;
int **matA,**matB,*matresultado;
/*-----------------------Funciones----------------------*/
/*La funcion cerrarpipe permitira como bien dice su nombre
cerrar las entradas no utilizadas*/
void cerrarpipe(int a){ /*el parametro i es la pipe utilizada*/
int j;
for(j=0;j<m;j++){
if(j!=a){
close(matdfA[j][0]); /*cerramos tanto la parte de lectura como de escritura de las pipes no utilizadas*/
close(matdfA[j][1]);
//close(matdfA[j]);
close(matdfB[j][0]);
close(matdfB[j][1]);
//close(matdfB[j]);
}
}
}
void padre_parte_envia_matriz(){
/* Creacion del buffer*/
int j,k, *bufr;
for(j=0;j>m;j++){
for(k=0;k<n;k++){
//bufr[k]=matA[j][k];
bufr[k]=matA[j][k];
}
write(matdfA[j][1],bufr,sizeof(bufr));
}
}
/*Leeremos los datos y asignaremos estos al buffer*/
void hijo_recibe(int i){
int *bufr,*resultado;
read(matdfA
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
int m,n,p; /*Variables que contendran las dimensiones de las matrice*/
int **matdfA,**matdfB;
int **matA,**matB,*matresultado;
/*-----------------------Funciones----------------------*/
/*La funcion cerrarpipe permitira como bien dice su nombre
cerrar las entradas no utilizadas*/
void cerrarpipe(int a){ /*el parametro i es la pipe utilizada*/
int j;
for(j=0;j<m;j++){
if(j!=a){
close(matdfA[j][0]); /*cerramos tanto la parte de lectura como de escritura de las pipes no utilizadas*/
close(matdfA[j][1]);
//close(matdfA[j]);
close(matdfB[j][0]);
close(matdfB[j][1]);
//close(matdfB[j]);
}
}
}
void padre_parte_envia_matriz(){
/* Creacion del buffer*/
int j,k, *bufr;
for(j=0;j>m;j++){
for(k=0;k<n;k++){
//bufr[k]=matA[j][k];
bufr[k]=matA[j][k];
}
write(matdfA[j][1],bufr,sizeof(bufr));
}
}
/*Leeremos los datos y asignaremos estos al buffer*/
void hijo_recibe(int i){
int *bufr,*resultado;
read(matdfA
- ,bufr,sizeof(bufr));
/*Procesamiento del buffer*/
write(matdfB[1],resultado,sizeof(resultado));
}
/*Creacion de las matrices iniciales aleatoriamente e impresion*/
void crear_matrices(int m, int n, int p){
int i,j;
//matA=(int *)malloc(sizeof(int*)*m);
//for(i=0;i<m;i++){
// matA=(int *)malloc(sizeof(int*)*n);
//}
for(i=0;i<m;i++){
for(j=0;j<n;j++){
matA[j]=rand()%9;
}
}
for(i=0;i<n;i++){
for(j=0;j<p;j++){
matB[j]=rand()%9;
}
}
printf("********Matriz A********");
for(i=0;i<m;i++){
for(j=0;j<n;j++){
printf("%d",matA[j]);
}
printf("\n");
}
printf("********Matriz B********");
for(i=0;i<n;i++){
for(j=0;j<p;j++){
printf("%d",matB[j]);
}
printf("\n");
}
}
void padre_obtiene_datos(){
fd_set fd;
int mayor;
int cont,j,i;
mayor=matdfB[0][0];
for(i=1;i<m;i++){
if(mayor<matdfB- ){
mayor=matdfB- ;
}
}
do{
FD_ZERO(&fd);
for(j=0;j<m;j++){
FD_SET(matdfB[j][0],&fd);
}
if(select(mayor+1,&fd,NULL,NULL,NULL)){
perror("Select");
}
else{
for(j=0;j<m;j++){
if(FD_ISSET(matdfB[j][0],&fd)){
/* ..........*/
}
else{
read(matdfB[j][0],matresultado,sizeof(matresultado));
cont++;
}
}
}
}while(cont<m);
}
int main(){
int i;
int j;
/*Peticion de las dimensiones para la creacion de matrices */
printf("De el numero de columnas en de la Matriz A: ");
scanf("%d",&n);
printf("\n De el numero de filas en de la Matriz A: ");
scanf("%d",&m);
printf("\n De el numero de filas en de la Matriz B: ");
scanf("%d",&p);
matdfA=(int **)malloc(sizeof(int *)*m);
for(i=0;i<m;i++){
matdfA=(int *)malloc(sizeof(int)*2);
matdfB=(int *)malloc(sizeof(int)*2);
for(j=0;j<m;j++){
if(pipe(matdfA[j]<0) || pipe(matdfB[j]<0)){
perror("Error creando pipes");
exit(0);
}
}
}
/* Creacion de los hijos con las caracteriasticas necesarias*/
for(i=0;i<m;i++){
if(fork()==0){
cerrarpipe(i);
hijo_recibe(i);
exit(0);
}
}
crear_matrices(m,n,p);
padre_parte_envia_matriz();
padre_obtiene_datos();
}
- ;
- ){