Quella frase non è molto chiara. In primo luogo, il genitore dovrebbe essere un antenato , poiché il processo di installazione della pipe può essere un genitore, o un nonno, o un nonno-... -grandparent o uno dei processi di comunicazione. In secondo luogo, la frase non significa "se si desidera una pipe, deve esistere un processo antenato comune", ma "se si desidera una pipe, un processo antenato comune deve impostarlo".
Sotto il cofano, un processo stabilisce un tubo con se stesso. La pipe è un descrittore di file come un altro, o più precisamente una coppia di descrittori di file, uno per ciascuna estremità. Il processo che ha creato la pipe può usarlo immediatamente per inviare dati a se stesso, sebbene ciò sia raramente utile (sebbene una self-pipe abbia il suo uso).
Un tipico idioma è che un processo installi una pipe, quindi diagli un processo figlio e chiuda un'estremità della pipe nel genitore e l'altra estremità della pipe nel figlio. Ciò consente al genitore e al processo figlio di comunicare in una direzione. Se i processi necessitano di comunicazione bidirezionale, hanno bisogno di due pipe (ad eccezione di alcune varianti unix in cui le pipe sono bidirezionali).
Le pipe vengono ereditate a turno da tutti i bambini, quindi il processo che ha creato la pipe potrebbe non essere coinvolto nella comunicazione. Ad esempio, una pipe in una shell creata tra due comandi esterni come ls | rot13
comporta i seguenti passaggi:
- La shell crea una pipe.
- La shell avvia un processo. Il bambino chiude l'estremità di lettura del tubo e chiamate
execve
su ls
.
- La shell avvia un processo. Il bambino chiude l'estremità di scrittura del tubo e chiede
execve
su rot13
.
- La shell chiude entrambe le estremità del tubo e attende l'uscita di entrambi i sottoprocessi.
Se due processi esistenti desiderano comunicare tra loro, possono utilizzare una pipa denominata . (Bene, c'è anche un descrittore di file che passa , ma non è per i deboli di cuore.)