View Full Version : [C unix] pipe
ceccoggi
02-07-2008, 01:01
mi è venuto un dubbio leggendo il funzionamento delle pipe.
In pratica si crea un array di dimensione 2 per la pipe, chiamato x esempio file_pipes[2].
Immaginando un programmino con padre che scrive nella pipe e figlio che legge, vedo che di norma se sono il padre e voglio scrivere devo prima chiudere file_pipes[0], ossia il descrittore della pipe relativo alla lettura, e poi scrivere su file_pipes[1]..viceversa per il figlio..
Il dubbio è, perchè devo chiudere un descrittore (se tanto non lo uso) per usare l'altro?
Qualcosa mi dice che è una domanda stupida, ma non ho trovato spiegazioni da nessuna parte a riguardo..
DanieleC88
02-07-2008, 01:30
Perché ciò che il sistema operativo ti restituisce sono due descrittori collegati in maniera unidirezionale: ciò che copi in scrittura su filedes[1] sarà disponibile su filedes[0] in lettura. Puoi ad esempio fare una fork() e passare i dati dal padre al figlio, ma dentro i singoli pezzi di codice dovrai chiudere i descrittori che non ti servono e che sono inutilizzati.
ceccoggi
02-07-2008, 12:49
... ma dentro i singoli pezzi di codice dovrai chiudere i descrittori che non ti servono e che sono inutilizzati.
Continuo a non capire, ok, dentro i singoli pezzi di codice il padre avra' i 2 descrittori aperti della pipe e il figlio pure..ma se nel padre non tocco il descrittore relativo alla lettura e nel figlio non tocco quello relativo alla scrittura, perche' che problema avrei a lasciarli aperti?
DanieleC88
02-07-2008, 13:07
Perché certe cose potrebbero non funzionare bene, è importante. La risposta è nelle pagine di manuale, come sempre:
An application that uses pipe(2) and fork(2) should use suitable close(2) calls to close unnecessary duplicate file descriptors; this ensures that end-of-file and SIGPIPE/EPIPE are delivered when appropriate.
Vada per SIGPIPE ed EPIPE che non credo tu possa intercettare in una situazione comune, ma l'EOF devi essere sicuro di riceverlo quando necessario nel processo che legge.
ceccoggi
02-07-2008, 13:28
si, ma ammettiamo che un figlio legga da una pipe in cui scrive il padre.
il figlio legge da fd[0]
il padre scrive su fd[1]
dove dovrebbe trovare l'EOF il figlio? non penso sull'fd[1] che chiude lui stesso, ma sull'fd[0] che sta leggendo immagino, no?
oppure forse ci sono..vuoi dire che il figlio, chiudendo fd[1] permette al padre di chiudere effettivamente il suo fd[1] quando finisce? Nel senso che se il figlio non chiudesse fd[1], il padre non potrebbe farlo nemmeno, dunque il figlio non incontrerebbe mai l'eof nell fd[0] che sta leggendo?
DanieleC88
02-07-2008, 14:17
Diciamo di sì. Tu chiudi nel figlio il descrittore in scrittura, il padre farà altrettanto quando avrà finito di scrivere: quando saranno chiusi i descrittori, il sistema operativo manda l'EOF sull'altra terminazione della pipe (ovvero il descrittore in lettura).
ceccoggi
02-07-2008, 14:40
se cosi' e' ora e' tutto + chiaro;)
grazie
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.