Dado el siguiente código:¿Qué sucede si un proceso secundario no cierra la tubería de escritura, mientras lee?
int main(int argc, char *argv[])
{
int pipefd[2];
pid_t cpid;
char buf;
if (argc != 2) {
fprintf(stderr, "Usage: %s \n", argv[0]);
exit(EXIT_FAILURE);
}
if (pipe(pipefd) == -1) {
perror("pipe");
exit(EXIT_FAILURE);
}
cpid = fork();
if (cpid == -1) {
perror("fork");
exit(EXIT_FAILURE);
}
if (cpid == 0) { /* Child reads from pipe */
close(pipefd[1]); /* Close unused write end */
while (read(pipefd[0], &buf, 1) > 0)
write(STDOUT_FILENO, &buf, 1);
write(STDOUT_FILENO, "\n", 1);
close(pipefd[0]);
_exit(EXIT_SUCCESS);
} else { /* Parent writes argv[1] to pipe */
close(pipefd[0]); /* Close unused read end */
write(pipefd[1], argv[1], strlen(argv[1]));
close(pipefd[1]); /* Reader will see EOF */
wait(NULL); /* Wait for child */
exit(EXIT_SUCCESS);
}
return 0;
}
Cada vez que el proceso hijo quiere leer de la tubería, se debe cerrar primero el lado del tubo de la escritura. Cuando elimino esa línea close(pipefd[1]);
del proceso secundario if
, , básicamente digo que "está bien, el niño puede leer desde la tubería, pero estoy permitiendo que el padre escriba en la tubería al mismo tiempo".
En caso afirmativo, ¿qué sucedería si la tubería está abierta para leer &? Sin exclusión mutua?
Se garantiza que la lectura() y la escritura() en una tubería son atómicas. (hasta el tamaño PIPE_BUFF). Eso significa: primero llegado, primero servido. Las partes escritas/leídas estarán entrelazadas, pero sus límites aún están intactos. – wildplasser
Si no cierra el extremo de escritura del niño del conducto, el niño nunca verá un EOF, ya que EOF solo aparecerá cuando el final de escritura haya sido cerrado por todos sus usuarios. Ver http://stackoverflow.com/questions/7868018/last-child-forked-will-not-die para ver un ejemplo. – ninjalj