Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: ithory en 14 Diciembre 2012, 16:06 pm



Título: Pasar más de un int con una pipe
Publicado por: ithory en 14 Diciembre 2012, 16:06 pm
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.



Código
  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <sys/types.h>
  4. #include <signal.h>
  5. #include <stdlib.h>
  6.  
  7.  
  8. int pidh;
  9. int i,j;
  10. int B[2][2];
  11. int pipe1[2];
  12. int enviar[2];
  13. int recibir[2];
  14. int salirhijo=0;
  15. int salirpadre=0;
  16.  
  17. void leer(){
  18. for(i=0;i<2;i++){
  19. read(pipe1[0],&recibir[i],sizeof(int));
  20. }
  21. //recibo los datos en el vector de 2 posiciones recibir[2].
  22. printf("Los datos recibidos por la pipe son: %d y %d", recibir[0], recibir[1]);
  23. }
  24.  
  25.  
  26. int main(){
  27.  
  28. pipe(pipe1);
  29.  
  30. pidh=fork();
  31.  
  32. if(pidh == 0){  //hijo
  33.  
  34.        signal(SIGUSR1,leer);
  35. while(salirhijo == 0){
  36.        printf("Hijo esperando...\n");
  37.        sleep(1);
  38.        }
  39.  
  40. }else{          //padre
  41.  
  42. sleep(1);
  43.  
  44. for (i=0;i<3;i++){
  45. for (j=0;j<3;j++){
  46. B[i][j]= rand() % 10;
  47.  
  48. printf("%d ",B[i][j]);
  49. sleep(1);
  50. }
  51. printf("\n");
  52.  
  53. }
  54.  
  55. printf("Elemento b11 -> %d\n",B[0][0]);
  56. printf("Elemento b32 -> %d\n",B[2][1]);
  57.  
  58. //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.
  59.  
  60. enviar[0] = B[0][0];
  61. enviar[1] = B[2][1];
  62.  
  63.        for(i=0;i<2;i++){
  64.        write(pipe1[1],&enviar[i],sizeof(int));
  65.        kill(pidh,SIGUSR1);
  66.        sleep(1);
  67.  
  68.        }
  69. }
  70. }
  71.  
  72.  
  73.  

Saludos y gracias!!


Título: Re: Pasar más de un int con una pipe
Publicado por: naderST en 14 Diciembre 2012, 19:49 pm
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.


Título: Re: Pasar más de un int con una pipe
Publicado por: ithory en 15 Diciembre 2012, 13:23 pm
Ok gracias, era eso que me había hecho un lío con las matrices!
Dejo el código corregido. Gracias.

Código
  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <sys/types.h>
  4. #include <signal.h>
  5. #include <stdlib.h>
  6.  
  7.  
  8. int pidh;
  9. int i,j;
  10. int B[2][2];
  11. int pipe1[2];
  12. int enviar[2];
  13. int recibir[2];
  14. int salirhijo=0;
  15. int salirpadre=0;
  16.  
  17. void leer(){
  18. for(i=0;i<=1;i++){
  19. read(pipe1[0],&recibir[i],sizeof(int));
  20. }
  21. //recibo los datos en el vector de 2 posiciones recibir[2].
  22. printf("Los datos recibidos por la pipe son: %d y %d\n", recibir[0], recibir[1]);
  23. salirhijo=1;
  24. }
  25.  
  26.  
  27. int main(){
  28. pipe(pipe1);
  29. pidh=fork();
  30.  
  31. if(pidh == 0){  //hijo
  32.  
  33.        signal(SIGUSR1,leer);
  34.        while(salirhijo == 0){
  35.        printf("Hijo esperando...\n");
  36.        sleep(1);
  37.        }
  38.  
  39. }else{          //padre
  40.  
  41. sleep(1);
  42.  
  43. for (i=0;i<2;i++){
  44. for (j=0;j<2;j++){
  45. B[i][j]= rand() % 10;
  46.  
  47. printf("%d ",B[i][j]);
  48. sleep(1);
  49. }
  50. printf("\n");
  51. }
  52.  
  53. enviar[0] = B[0][0];
  54. enviar[1] = B[1][1];
  55.  
  56.  
  57. printf("Elemento b11 -> %d\n",enviar[0]);
  58. printf("Elemento b22 -> %d\n",enviar[1]);
  59. printf("Estos datos son los que voy a pasar por la pipe\n");
  60. //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.
  61.  
  62.        for(i=0;i<=1;i++){
  63.        write(pipe1[1],&enviar[i],sizeof(int));
  64.        kill(pidh,SIGUSR1);
  65.        sleep(1);
  66.  
  67.        }
  68. }
  69.  
  70. }
  71.