Salve a tutti,
sto studiando le pipe e su internet si trova spesso l'esempio base che tratta il passaggio di uno stringa tra padre e figlio.
La teoria dice che, se tutti i lati lettura sono chiusi, quando faccio una write ricevo un segnale SIGPIPE... se leggo con tutti i lati scrittura chiusi la read ritorna zero. Riporto il seguente esempio trovato su internet:
codice:
#include <stdio.h>
#define READ 0 
#define WRITE 1 
char *phrase = "Stuff this in your pipe";
int main (void) {
int fd [2], bytesRead;
char message [100]; 
pipe (fd); 
if (fork () == 0) { /* Child, writer */
close(fd[READ]); /* Close unused end */
write (fd[WRITE], phrase, strlen (phrase) + 1); /* include \0 */
close (fd[WRITE]); /* Close used end */
}
else { /* Parent, reader*/
close (fd[WRITE]); /* Close unused end */
bytesRead = read (fd[READ], message, 100);
printf ("Read %d bytes: %s\n", bytesRead, message);
close (fd[READ]); /* Close used end */
}
}
Supponiamo che parta prima il processo figlio: costui chiude il lato lettura, scrive sulla pipe ed infine chiude il lato scrittura. A questo punto il processo padre chiude il lato scrittura prima di leggere. La read perchè funziona? Teoricamente dovrebbe restituire zero in quanto nel momento della lettura tutti i lati della scrittura sono stati chiusi(uno dal padre ed uno dal figlio) per cui non ci sono processi scrittura. Non riesco a capire perchè questo codice funziona correttamente.
Grazie