Dato il seguente codice:Cosa succede se un processo figlio non chiude la pipe dalla scrittura, durante la lettura?
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;
}
Ogni volta che il processo figlio vuole leggere dal tubo, si deve prima chiudere lato del tubo dalla scrittura. Quando rimuovo la riga close(pipefd[1]);
dal processo figlio if
, , sto praticamente dicendo che "okay, il bambino può leggere dalla pipe, ma sto permettendo al genitore di scrivere sulla pipe allo stesso tempo"?
In tal caso, cosa accadrebbe quando la pipe è aperta sia per la lettura della scrittura &? Nessuna esclusione reciproca?
Leggere() e scrivere() su un tubo sono garantiti come atomici. (fino alla dimensione PIPE_BUFF). Ciò significa: primo arrivato, primo servito. Le parti scritte/lette saranno interlacciate, ma i loro confini sono ancora intatti. – wildplasser
Se non si chiude la fine di scrittura del child della pipe, il bambino non vedrà mai un EOF, poiché EOF verrà visualizzato solo quando la fine della scrittura è stata chiusa da tutti i suoi utenti. Vedi http://stackoverflow.com/questions/7868018/last-child-forked-will-not-die per un esempio. – ninjalj