Essa frase não é muito clara. Primeiro, pai deve ser ancestral , pois o processo de configuração do canal pode ser pai / mãe, avô ou avô-grand-grand… ou um dos os processos de comunicação. Segundo, a sentença não significa “se você quer um pipe, deve existir um processo ancestral comum”, mas “se você quer um pipe, um processo ancestral comum deve configurá-lo”.
Sob o capô, um processo estabelece um tubo consigo mesmo. O pipe é um descritor de arquivo como qualquer outro, ou mais precisamente um par de descritores de arquivos, um para cada extremidade. O processo que criou o pipe pode usá-lo imediatamente para enviar dados para si mesmo, embora isso raramente seja útil (embora um autopreenchimento tem seu uso).
Um idioma típico é para um processo configurar um canal, depois separar um processo filho e fechar uma extremidade do canal no pai e a outra extremidade do canal no filho. Isso permite que o pai e o processo filho se comuniquem em uma direção. Se os processos precisam de comunicação bidirecional, eles precisam de dois tubos (exceto em algumas variantes unix onde os tubos são bidirecionais).
Os pipes são herdados por qualquer criança, então o processo que criou o pipe pode não estar envolvido na comunicação. Por exemplo, um pipe em um shell criado entre dois comandos externos, como ls | rot13
, envolve as seguintes etapas:
- O shell cria um pipe.
- O shell bifurca um processo. O filho fecha a extremidade de leitura do canal e chama
execve
on ls
.
- O shell bifurca um processo. O filho fecha a extremidade de gravação do pipe e chama
execve
on rot13
.
- O shell fecha ambas as extremidades do pipe e aguarda a saída de ambos os subprocessos.
Se dois processos existentes quiserem se comunicar, eles podem usar um canal nomeado . (Bem, também há descritor de arquivo passando , mas não é para os desmaiados coração.)