C/Visual C - Pipes en C

 
Vista:

Pipes en C

Publicado por Sandra (1 intervención) el 07/05/2015 00:23:28
¡Hola! Tengo un problema con un código en C. El ejercicio consiste en crear una comunicación bidireccional padre-hijo mediante tuberías sin nombre. El objetivo es que padre e hijo vayan enviándose mensajes (el hijo por una tubería y el padre por otra) hasta que se alcance un número de mensajes concretos, o bien hasta que el usuario introduzca por teclado una palabra que indique que se finaliza el intercambio de mensajes, por ejemplo "FIN" (las dos opciones son perfectamente válidas).

A continuación está mi código, el cual no genera errores al compilar, pero únicamente consigo que el padre envíe un mensaje al hijo, ¿alguien podría ayudarme a ver el fallo y ofrecerme alguna solución?

#include <stdio.h>
#include <fcntl.h>
#include <sys/types.h>
#include <unistd.h>
#define TAMANYO 512

int main(int argc, int argv)
{
pid_t pid;
size_t strlen();
int tuberia1[2], tuberia2[2], bytesleidos, i;
char datos[TAMANYO];
pipe(tuberia1);
pipe(tuberia2);

for(i = 0; i < 5; i++)
{
if ((pid = fork()) == 0)
{ //proceso hijo
close(tuberia1[1]); /* cerrar lado de escritura de tuberia1 */
close(tuberia2[0]); /* cerrar lado de lectura de tuberia2 */
while((bytesleidos = read(tuberia1[0], datos, TAMANYO)) > 0)
write(1, datos, bytesleidos);
close(tuberia1[0]); /* cerrar lado de lectura de tuberia1 */
sprintf(datos, "Hola, yo soy tu hijo escribiendo por tuberia1. Iteracion: %d\n", i);
write(tuberia1[1], datos, strlen(datos));
close(tuberia1[1]);
}
else
{ //proceso padre
close(tuberia1[0]); /* cerrar lado de lectura de tuberia1*/
close(tuberia2[1]); /* cerrar lado de escritura de tuberia2*/
sprintf(datos, "Hola, yo soy tu padre escribiendo por tuberia2. Iteracion: %d\n", i);
write(tuberia1[1], datos, strlen(datos));
close(tuberia1[1]);
while((bytesleidos = read(tuberia2[0], datos, TAMANYO)) > 0 )
write(1, datos, bytesleidos);
close(tuberia2[0]);
}
}
waitpid(pid, NULL, 0);
return 0;
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Pipes en C

Publicado por Tom (619 intervenciones) el 07/05/2015 08:58:15
En la parte del "hijo" haces algo curioso:

close(tuberia1[1]); /* cerrar lado de escritura de tuberia1 */
...
...
write(tuberia1[1], datos, strlen(datos));
close(tuberia1[1]);

No te das cuenta de tu fallo porque no estás haciendo ningún control de errores.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar