¿Existe la posibilidad de que no pueda imprimir? (C, proceso)
#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?
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 SIGPIPE
señal cuando llame write()
.