Convertir tubería a cadena utilizando lectura/escritura después de bifurcar.
Estoy teniendo problemas para entender cómo funcionan los pipes y el fork juntos para un curso en línea. En primer lugar, quiero escribir dos cadenas debajo de un printf y luego, cuando se lean/escriban las dos, concatenarlas en una sola.
Estoy atascado en el read/write para ambos hijos, el problema es que no coincide con lo que quiero porque primero imprime las cadenas y luego abre el canal para escribir. Tal vez sea un pequeño asunto, pero estoy comenzando a usar C para un curso en línea. Las funciones de lectura y escritura son obligatorias.
Cadena 1:
sdfsdfsdf
Cadena 2:
Sdfsdfdsfsdfsd
Cadena concatenada:
sdfsdfsdfSdfsdfdsfsdfsd
Aquí está mi código hasta ahora.
int main()
{
int fd1[2], fd2[2];
int status, pid;
pipe(fd1);
printf("Cadena 1: \n");
pid = fork();
if (pid == 0)
{
close(fd1[0]);
char cad1[100];
read(0, &cad1, 100);
write(fd1[1], &cad1, 100);
close(fd1[1]);
exit(0);
}
else
{
close(fd1[1]);
printf("Cadena 2: \n");
pipe(fd2);
pid = fork();
if (pid == 0)
{
close(fd2[0]);
close(fd1[0]);
char cad2[100];
read(0, &cad2, 100);
write(fd2[1], &cad2, 100);
close(fd2[1]);
exit(0);
}
}
close(fd2[0]);
/* esperar por cada hijo */
wait(&status);
wait(&status);
return 0;
}
Mi salida es así:
Cadena 1:
Cadena 2:
cvbcvbcvbcvb
cvbcvbcvbcvb
Para concatenar mis cadenas (no implementado en el código), creo que debería llamar a ambos pipes en una variable char[] antes de concatenar.
¿Alguna sugerencia para mejorar mi código?
Gracias de antemano.
davy.ai
Parece que el problema con su código es que no está esperando a que los hijos terminen sus tareas antes de imprimir la segunda cadena. Esto hace que la salida se mezcle y no coincida con lo que espera.
Una sugerencia para mejorar su código es usar la función
dup2()
para redirigir la entrada/salida de los hijos al conducto, para que no tenga que usarread()
ywrite()
con los descriptores de archivo 0 y 1. Aquí hay un ejemplo de cómo hacerlo:En este código, usamos
fgets()
para leer las cadenas desde la entrada del usuario, ystrlen()
para obtener sus longitudes. En el hijo 1, simplemente escribimos la primera cadena en el conducto.En el hijo 2, cerramos el extremo de escritura del conducto 1, y leemos del extremo de lectura para obtener la primera cadena. Luego concatenamos las dos cadenas en el búfer
cat
y lo escribimos en el conducto 2. Finalmente, cerramos el extremo de lectura del conducto 2 y salimos.En el padre, cerramos ambos extremos del conducto 1, ya que ya no lo necesitamos. Luego leemos del conducto 2 en el búfer
cat
y lo imprimimos como la salida final. Esperamos a que terminen ambos hijos antes de salir del programa.Espero que esto le ayude a comprender mejor los conductos y bifurcaciones, ¡y buena suerte con su curso en línea!