¿Existe la posibilidad de que no pueda imprimir? (C, proceso)

Resuelto iyeaaa asked hace 6 meses • 1 respuestas

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <sys/wait.h>

int main() {

    pid_t c[2];
    int p[2];

    pipe(p);
    c[0] = fork();

    if (c[0] < 0) {
        fprintf(stderr, "fork error");
        exit(EXIT_FAILURE);
    } else if (c[0] == 0) {
        // First child

        close(p[1]); // unuse
        close(STDIN_FILENO);
        dup(p[0]);

        char buf[BUFSIZ];
        read(STDIN_FILENO, buf, BUFSIZ);
        printf("Second child's print: %s\n", buf); // First Child's print
    } else {
        c[1] = fork();

        if (c[1] < 0) {
            fprintf(stderr, "fork error");
            exit(EXIT_FAILURE);
        }
        else if (c[1] == 0) {
            // Second child

            close(p[0]); // unuse
            close(STDOUT_FILENO);
            dup(p[1]);
            printf("HI"); // Second child's print
        }
        else if (waitpid(c[0], NULL, 0) == -1 || waitpid(c[1], NULL, 0) == -1) {
            exit(EXIT_FAILURE);
        }
    }

    return 0;
}

Escribí un código para que el primer hijo reciba el mensaje de la función write() del segundo hijo a través de la función read() del primer hijo.

Si se cosecha al primer niño antes de imprimir "HI", ¿existe la posibilidad de que no pueda imprimir?

si existe la posibilidad ¿Cómo solucionarlo?

iyeaaa avatar Feb 15 '24 22:02 iyeaaa
Aceptado

No. Cuando el primer niño llame read(), se bloqueará esperando que se escriba algo en la tubería. No saldrá hasta que el segundo hijo escriba en la tubería, por lo que la escritura no fallará.

El escenario que imagina podría ocurrir si coloca la tubería en modo sin bloqueo. Entonces read()no esperará a que se escriba algo y el primer niño podría salir antes de que el segundo intente escribir. Si esto sucede, el segundo niño recibirá una SIGPIPEseñal cuando llame write().

Barmar avatar Feb 15 '2024 15:02 Barmar