Pasar más de un int con una pipe

Iniciado por ithory, 14 Diciembre 2012, 16:06 PM

0 Miembros y 1 Visitante están viendo este tema.

ithory

Hola, ¿es posible pasar más de un int por cada pipe o solo se puede pasar un dato por cada pipe?

Yo tengo 2 valores enteros que quiero enviárselos del proceso padre al hijo mediante una pipe.

Cuando envío los valores los meto en el vector enviar[2] y cuando los recibo los guardo en recibir[2].
Pero al recibirlo y mostrarlo me muestra unos caracteres raros.




#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <signal.h>
#include <stdlib.h>


int pidh;
int i,j;
int B[2][2];
int pipe1[2];
int enviar[2];
int recibir[2];
int salirhijo=0;
int salirpadre=0;

void leer(){
for(i=0;i<2;i++){
read(pipe1[0],&recibir[i],sizeof(int));
}
//recibo los datos en el vector de 2 posiciones recibir[2].
printf("Los datos recibidos por la pipe son: %d y %d", recibir[0], recibir[1]);
}


int main(){

pipe(pipe1);

pidh=fork();

if(pidh == 0){  //hijo

        signal(SIGUSR1,leer);
while(salirhijo == 0){
        printf("Hijo esperando...\n");
        sleep(1);
        }

}else{          //padre

sleep(1);

for (i=0;i<3;i++){
for (j=0;j<3;j++){
B[i][j]= rand() % 10;

printf("%d ",B[i][j]);
sleep(1);
}
printf("\n");

}

printf("Elemento b11 -> %d\n",B[0][0]);
printf("Elemento b32 -> %d\n",B[2][1]);

//le voy a enviar 2 elementos al hijo por la pipe, para ello antes los meto en el vector enviar que es de 2 posiciones.

enviar[0] = B[0][0];
enviar[1] = B[2][1];

        for(i=0;i<2;i++){
        write(pipe1[1],&enviar[i],sizeof(int));
        kill(pidh,SIGUSR1);
        sleep(1);

        }
}
}




Saludos y gracias!!

naderST

Puedes pasar n bytes por una tubería. En tu código tienes un error y es que tratas B como una matriz 3x3 cuando esta es 2x2.

ithory

Ok gracias, era eso que me había hecho un lío con las matrices!
Dejo el código corregido. Gracias.


#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <signal.h>
#include <stdlib.h>


int pidh;
int i,j;
int B[2][2];
int pipe1[2];
int enviar[2];
int recibir[2];
int salirhijo=0;
int salirpadre=0;

void leer(){
for(i=0;i<=1;i++){
read(pipe1[0],&recibir[i],sizeof(int));
}
//recibo los datos en el vector de 2 posiciones recibir[2].
printf("Los datos recibidos por la pipe son: %d y %d\n", recibir[0], recibir[1]);
salirhijo=1;
}


int main(){
pipe(pipe1);
pidh=fork();

if(pidh == 0){  //hijo

       signal(SIGUSR1,leer);
       while(salirhijo == 0){
       printf("Hijo esperando...\n");
       sleep(1);
       }

}else{          //padre

sleep(1);

for (i=0;i<2;i++){
for (j=0;j<2;j++){
B[i][j]= rand() % 10;

printf("%d ",B[i][j]);
sleep(1);
}
printf("\n");
}

enviar[0] = B[0][0];
enviar[1] = B[1][1];


printf("Elemento b11 -> %d\n",enviar[0]);
printf("Elemento b22 -> %d\n",enviar[1]);
printf("Estos datos son los que voy a pasar por la pipe\n");
//le voy a enviar 2 elementos al hijo por la pipe, para ello antes los meto en el vector enviar que es de 2 posiciones.

       for(i=0;i<=1;i++){
       write(pipe1[1],&enviar[i],sizeof(int));
       kill(pidh,SIGUSR1);
       sleep(1);

       }
}

}