es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , ,

Answer

  1. Avatar for 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 usar read() y write() con los descriptores de archivo 0 y 1. Aquí hay un ejemplo de cómo hacerlo:

    int main() {
        int fd1[2], fd2[2];
        int status, pid1, pid2;
        char str1[100], str2[100], cat[200];
    
        pipe(fd1);
    
        pid1 = fork();
        if (pid1 == 0) {
            // hijo 1
            close(fd1[0]);
            printf("Cadena 1: ");
            fgets(str1, sizeof(str1), stdin);
            write(fd1[1], str1, strlen(str1)+1);
            close(fd1[1]);
            exit(0);
        }
    
        pipe(fd2);
        pid2 = fork();
        if (pid2 == 0) {
            // hijo 2
            close(fd1[1]);
            close(fd2[0]);
            printf("Cadena 2: ");
            fgets(str2, sizeof(str2), stdin);
            read(fd1[0], cat, sizeof(cat));
            strcat(cat, str2);
            write(fd2[1], cat, strlen(cat)+1);
            close(fd2[1]);
            exit(0);
        }
    
        // padre
        close(fd1[0]);
        close(fd1[1]);
        close(fd2[1]);
        read(fd2[0], cat, sizeof(cat));
        printf("Concatenación de cadenas:\n%s", cat);
        wait(&status);
        wait(&status);
        return 0;
    }
    

    En este código, usamos fgets() para leer las cadenas desde la entrada del usuario, y strlen() 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!

Comments are closed.