• Sábado 14 de Diciembre de 2024, 23:26

Autor Tema:  Pipes entre procesos  (Leído 2171 veces)

orilla

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Pipes entre procesos
« en: Domingo 19 de Octubre de 2008, 18:15 »
0
Bien, tengo que crear un proceso padre con dos hijos, luego conectarlos mediante un pipe, y entonces mandar un valor aleatorio (rand) desde el padre al hijo.Este numero aleatorio, sera las veces que tendre que imprimir el pid del padre y el hijo. La creación del padre y los hijos creo que lo tengo bien, el problema es cuando le paso los parametros al write y al read que nose si lo hago bien, ademas, me da un error con el strlen. Os dejo el codigo y haber si me podeis indicar si lo hago bien o que pasa. Lo del readbuffer lo puse porque lo vi en un programa, pero alli se pasaba un string en vez de un int :S
Muchas gracias

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

int main(int argc, char *argv[])
{
pid_t pid1, pid2;
int status1, status2, nbytes;
int p1[2], p2[2];
int buffer;
char readbuffer[80];



if(pipe(p1) < 0)
{
perror( "Errorn");
}
printf("Soy el padre %dn", getpid());
pid1=fork();
if ( pid1<0)
{
perror("Se ha producido un error n");
}
if ( pid1 == 0 )
{ /* hijo */
close(p1[1]);
//0 = read
nbytes = read(p1[0], readbuffer, sizeof(readbuffer));
printf("Numero recibido: %d", readbuffer);
while (buffer>0)
{
printf("Soy el primer hijo %d, n", getpid());
printf(" Soy el padre %d,n",getppid());
alarm(5);
buffer=buffer -1;
}

}
else
{ /* padre */
pid2=fork();
if(pid2<0){
perror("Se ha producido un error n");

}
if ( pid2 == 0 )
{ /* segundo hijo */
close(p2[1];
while (buffer>0)
{
printf("Soy el segundo hijo %d, n", getpid());
printf(" Soy el padre %d,n",getppid());
alarm(5);
buffer=buffer -1;
}

}
else
{ /* padre */
buffer=rand();
close(p1[0]);
close([p2[0]);
write(p1[1], buffer, (strlen(buffer)+1));
write(p2[1], buffer, (strlen(buffer)+1));
/* Esperamos al primer hijo */
waitpid(pid1, &status1, 0);
/* Esperamos al segundo hijo */
waitpid(pid2, &status2, 0);
printf("Soy el padre %dn", getpid());
}
}

return 0;
}

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Pipes entre procesos
« Respuesta #1 en: Domingo 19 de Octubre de 2008, 18:43 »
0
¡Bienvenido al foro, orilla!

En un primer vistazo, arregla estas dos cosillas:

Cita de: "orilla"
nbytes = read(p1[0], readbuffer, sizeof(readbuffer));

Como bien dices, el error está el readbuffer, ya que quieres que sea un int y no una cadena, así que deberías hacer:

Código: C
  1.  
  2. int *readbuffer;
  3. [...]
  4. readbuffer = malloc(sizeof(int));
  5. [...]
  6. nbytes = read(p1[0], readbuffer, sizeof(int));
  7.  
  8. // O TAMBIÉN
  9. int readbuffer;
  10. [...]
  11. nbytes = read(p1[0], &readbuffer, sizeof(readbuffer));
  12.  
  13.  

Cita de: "orilla"
write(p1[1], buffer, (strlen(buffer)+1));

Y aquí hay que pasarle la dirección del entero y no el entero en sí, es decir, el mismo fallo de antes:

Código: C
  1.  
  2. write(p1[1], &buffer, (strlen(buffer)+1));
  3.  
  4.  

Ah, ¡y la próxima vez usa las etiquetas de código!

orilla

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: Pipes entre procesos
« Respuesta #2 en: Domingo 19 de Octubre de 2008, 18:57 »
0
Gracias. Tienes razon, hay que añadir el &, aunque me sigue dando el mismo error..en la linia del write (..) Dice:  
proveta.c:63: aviso: declaración implícita incompatible de la función interna ‘strlen’
proveta.c:63: aviso: el paso del argumento 1 de ‘strlen’ crea un puntero desde un entero sin una conversión
Gracias

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Pipes entre procesos
« Respuesta #3 en: Lunes 20 de Octubre de 2008, 00:24 »
0
Ah, no me había dado cuenta, jejeje. Es lo que tiene el copiar-pegar  :P sustituye el strlen() por sizeof(int)

orilla

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: Pipes entre procesos
« Respuesta #4 en: Lunes 20 de Octubre de 2008, 15:35 »
0
Muchas gracias!

orilla

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: Pipes entre procesos
« Respuesta #5 en: Miércoles 22 de Octubre de 2008, 16:26 »
0
Haber..ahora la practica se ha complicado un poquito, para variar.

Muchas gracias de nuevo!

Yo he pensado algo asi
Código: Text
  1.     #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>                          
  4. #include <sys/types.h>
  5. #include <unistd.h>              /* incluim les llibreries necessaries */
  6. #include <fcntl.h>
  7. #include <sys/wait.h>
  8. #include <math.h>
  9.  
  10. int main(int argc, char *argv[])
  11. {
  12.     pid_t pid1, pid2;
  13.     int status1, status2, nbytes,nbytes2,max=1;
  14.     int i=0;
  15.     int p1[2], p2[2], p3[2], p4[2];
  16.     int buffer1, buffer2;
  17.     int readbuffer1, readbuffer2,readbuffer3,readbuffer4;
  18.    
  19.    
  20.  
  21.     void manejador(int sig)
  22.     {
  23.     close(p3[0]);
  24.     printf("Excepción capturadan");
  25.     printf("Enviando al padre la señal SIGUSR1 n");
  26.     int sig_num1=5;
  27.     write(p3[1], &sig_num1,sizeof(int));
  28.          
  29.         }
  30.     void manejador2(int sig)
  31.     {
  32.     close(p4[0]);
  33.     printf("Excepción capturadan");
  34.     printf("Enviando al padre la señal SIGUSR2 n");
  35.     int sig_num2=6;
  36.     write(p4[1], &sig_num2,sizeof(int));
  37.          
  38.         }
  39.    
  40.     /*void RutinaTratSIGUSR1(int sig)
  41.     {  
  42.     printf("Enviando SIGUSR1n");
  43.     }
  44.     void RutinaTratAlarm(int sig)
  45.     {
  46.     printf("Esperando 3 segundos n");
  47.     sleep(3);
  48.    
  49.     }*/
  50.  
  51.      if(pipe(p1) < 0)
  52.     {
  53.         perror( "Errorn");
  54.      }
  55.  
  56.      if(pipe(p2) < 0)
  57.     {
  58.         perror( "Errorn");
  59.      }
  60.    
  61.      if(pipe(p3) < 0)
  62.     {
  63.         perror( "Errorn");
  64.      }
  65.    
  66.      if(pipe(p4) < 0)
  67.     {
  68.         perror( "Errorn");
  69.      }
  70.  
  71.     printf("Soy el padre %dn", getpid());
  72.     pid1=fork();
  73.     if ( pid1<0)
  74.     {
  75.     perror("Se ha producido un error n");
  76.     }
  77.     if ( pid1 == 0 )
  78.     { /* hijo */    
  79.              close(p1[1]);
  80.             //0 = read
  81.             nbytes = read(p1[0], &readbuffer1, sizeof(readbuffer1));
  82.             printf("Numero recibido1: %d, n", readbuffer1);
  83.                     while (readbuffer1>i)
  84.             {
  85.             printf("Soy el primer hijo %d, n",  getpid());
  86.             printf(" Soy el padre %d,n",getppid());    
  87.             i++;
  88.            
  89.            
  90.             //signal(SIGALRM, RutinaTratAlarm);
  91.             }
  92.             signal(SIGUSR1,manejador);
  93.                
  94.                 kill(getppid(),SIGUSR1);          
  95.                
  96.            
  97.     }
  98.     else
  99.     { /*  padre */
  100.         pid2=fork();
  101.         if(pid2<0)
  102.         {
  103.         perror("Se ha producido un error n");
  104.        
  105.         }
  106.         if ( pid2 == 0 )
  107.         { /* segundo hijo  */
  108.             close(p2[1]);
  109.             //0 = read
  110.             nbytes2 = read(p2[0], &readbuffer2, sizeof(readbuffer2));
  111.             printf("Numero recibido2: %d, n", readbuffer2);
  112.                     while (readbuffer2>i)
  113.             {
  114.             printf("Soy el segundo hijo %d,n",  getpid());
  115.             printf(" Soy el padre %d,n",getppid());
  116.             sleep(1);
  117.             i++;
  118.            
  119.             }
  120.             signal(SIGUSR2,manejador);
  121.             kill(getppid(),SIGUSR2);
  122.         }
  123.         else
  124.         { /* padre */
  125.             buffer1=5;
  126.             buffer2=3;
  127.             close(p1[0]);
  128.             close(p2[0]);
  129.             close(p3[1]);
  130.             close(p4[1]);
  131.  
  132.             write(p1[1], &buffer1, sizeof(buffer1));    //Pipe al 1r hijo
  133.             write(p2[1], &buffer2, sizeof(buffer2));    //Pipe al 2o hijo
  134.            
  135.            
  136.             if(read(p3[0], &readbuffer3, sizeof(int)))
  137.                                     //Leer sigusr1
  138.             {
  139.             pause();
  140.             printf("SIGUSR1 recibido %d,n", readbuffer3);
  141.             write(p1[1], &buffer1, sizeof(int));
  142.             }
  143.  
  144.             if(read(p4[0], &readbuffer4, sizeof(int)))  //Leer sigusr2      
  145.             {
  146.             printf("SIGUSR2 recibido %d,n", readbuffer3);
  147.             write(p2[1], &buffer1, sizeof(int));
  148.             }
  149.                                     /* Esperamos al primer hijo */
  150.             waitpid(pid1, &status1, 0);
  151.                                     /* Esperamos al segundo hijo */
  152.             waitpid(pid2, &status2, 0);
  153.             printf("Soy el padre %dn", getpid());
  154.            
  155.         }
  156.     }
  157.  
  158.     return 0;
  159. }
  160.  
  161.  
« última modificación: Viernes 24 de Octubre de 2008, 18:18 por orilla »

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Pipes entre procesos
« Respuesta #6 en: Jueves 23 de Octubre de 2008, 10:37 »
0
orilla, ¿qué tal si lo depuras y reduces el código a las líneas donde creas que puede estar el problema? Así es más fácil para todos solucionarlo. Un saludo.