Esa oración no es muy clara. Primero, el padre debe ser ancestro , ya que el proceso de configuración de la tubería puede ser padre, abuelo, abuelo, abuelo o uno de los procesos de comunicación. En segundo lugar, la oración no significa "si quieres una tubería, debe existir un proceso ancestro común", sino "si quieres una tubería, debe configurarse un proceso ancestral común".
Debajo del capó, un proceso establece una tubería consigo mismo. La canalización es un descriptor de archivo como cualquier otro, o más precisamente un par de descriptores de archivo, uno para cada extremo. El proceso que creó la tubería puede usarlo inmediatamente para enviarse datos a sí mismo, aunque esto rara vez es útil (aunque una tubería automática tiene su uso).
Un idioma típico es que un proceso establezca una tubería, luego bifurque un proceso hijo y cierre un extremo de la tubería en el padre y el otro extremo de la tubería en el niño. Esto permite que el proceso primario y secundario se comuniquen en una dirección. Si los procesos necesitan comunicación bidireccional, necesitan dos tuberías (excepto en algunas variantes de Unix donde las tuberías son bidireccionales).
Las tuberías son heredadas a su vez por cualquier hijo, por lo que el proceso que creó la tubería puede no estar involucrado en la comunicación. Por ejemplo, una tubería en un shell creada entre dos comandos externos, como ls | rot13
los siguientes pasos:
- El caparazón crea una tubería.
- El shell bifurca un proceso. El niño cierra el extremo de lectura de la tubería y las llamadas
execve
en ls
.
- El shell bifurca un proceso. El niño cierra el extremo de escritura de la tubería y llama
execve
en rot13
.
- La carcasa cierra ambos extremos de la tubería y espera a que salgan ambos subprocesos.
Si dos procesos existentes desean comunicarse entre sí, pueden usar una tubería con nombre . (Bueno, también hay un descriptor de archivo que pasa , pero no es para los débiles de corazón).