elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Pasar más de un int con una pipe
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Pasar más de un int con una pipe  (Leído 3,753 veces)
ithory

Desconectado Desconectado

Mensajes: 14


Ver Perfil
Pasar más de un int con una pipe
« 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!!


En línea

naderST


Desconectado Desconectado

Mensajes: 625



Ver Perfil WWW
Re: Pasar más de un int con una pipe
« Respuesta #1 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.


En línea

ithory

Desconectado Desconectado

Mensajes: 14


Ver Perfil
Re: Pasar más de un int con una pipe
« Respuesta #2 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.  
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[Pedido] cmd pipe en vb6 « 1 2 »
Programación Visual Basic
hepy_92 11 3,870 Último mensaje 22 Abril 2007, 00:13 am
por byebye
[Resuelto]CMD Pipe en vb6
Programación Visual Basic
hepy_92 4 1,642 Último mensaje 26 Abril 2007, 14:30 pm
por byebye
Ayuda con CMD Pipe vb6 « 1 2 »
Programación Visual Basic
hepy_92 17 7,964 Último mensaje 18 Diciembre 2009, 15:40 pm
por Karcrack
pipe y QT!
Programación C/C++
febef 2 1,181 Último mensaje 17 Abril 2013, 01:26 am
por febef
Pipe doble
GNU/Linux
desikoder 3 2,096 Último mensaje 12 Noviembre 2013, 17:07 pm
por desikoder
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines